题目大意:第一行输入n(<=8), k(<=n)。在输入n*n的棋盘,其中#表示可以下棋,.表示不能下棋,其中排放的任意两个棋子不能在同一行或者同一列,求排放k个棋子的方案数
dfs形参为枚举的行号
for循环枚举列号
八皇后是八行排八个,而该题的k<=n,所以应该在for循环外加一句dfs(prow+1),即跳过prow行,继续搜索prow+1行
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn = 10;
char a[maxn][maxn];
bool vis[maxn];//标记该列有无放置
int n, k, m, ans;
void dfs(int prow)//枚举行
{
if(k==m)
{
++ans;
return;
}
if(prow >= n) return;
for(int i = 0; i < n; ++i)//枚举列
{
if(vis[i] || a[prow][i]=='.') continue;
vis[i] = 1;
++m;
dfs(prow+1);
vis[i] = 0;
--m;
}
dfs(prow+1);//
}
int main()
{
while(~scanf("%d %d", &n, &k) && ~n && ~k)
{
for(int i = 0; i < n; ++i) scanf("%s", a[i]);
ans = 0;
memset(vis, 0, sizeof(vis));
dfs(0);
printf("%d\n", ans);
}
return 0;
}