在一个n*n的棋盘上,#代表可以放棋子的位置。要放k个棋子,问有多少种方案
dfs的简单题,直接搜就行,搜到一种方案就计数
要注意判断条件和vis标记
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<queue>
using namespace std;
int n,sum,k;
char mp[10][10];
bool vis[10][10];
bool check(int x,int y)
//判断这一列有没有放过棋子
{
int i;
for(i=n-1;i>=0;i--)
{
if(vis[i][y])
return 0;
}
return 1;
}
void dfs(int st,int step)
{
int i,j;
if(step==k)
{
sum++;
//找到一种方案,sum加一
return;
}
for(i=st;i<n;i++)//从st开始
{
for(j=0;j<n;j++)
{
if(!vis[i][j]&&mp[i][j]=='#'&&check(i,j))
{
vis[i][j]=1;
dfs(i+1,step+1);
//从下一行开始搜,保证行和列都没有棋子放过
vis[i][j]=0;//被标记的都是现在棋盘上的棋子
}
}
}
}
int main()
{
int i,j;
while(scanf("%d%d",&n,&k)==2)
{
if(n==-1&&k==-1)break;
for(i=0;i<n;i++)
scanf("%s",mp[i]);
sum=0;
memset(vis,0,sizeof(vis));
//初始化
dfs(0,0);
printf("%d\n",sum);
}
return 0;
}