注意理解题意:"#“表示可以放置的区域,”."表示不可以放置的区域
既然保证不出现多余的空白行或空白列,可以不去考虑一行没有棋盘格可以放置的情况
Sample Input
2 1
#.
.#
4 4
…#
…#.
.#…
#…
-1 -1
Sample Output
2
1
#include <iostream>
#include <cstdio>
using namespace std;
int ans;
char grid[8][8];
bool column[8]={0,0,0,0,0,0,0,0};
void dfs(int u, int k, int n)
{
// 得到了一种结果
if(k==0)
{
ans++;
return;
}
// 没有位置放了
if(u==n)
return;
// 遍历每一行的格子,如果可以放就放置并进入下一行
for(int i=0;i<n;i++)
{
if(column[i]!=1&&grid[u][i]=='#')
{
column[i] = 1;
grid[u][i] = '.';
dfs(u+1,k-1,n);
column[i] = 0; grid[u][i]='#';
}
// 若需要考虑空白行的情况,可在此处加dfs
}
dfs(u+1,k,n);
}
int main() {
int n,k;
while(scanf("%d %d",&n,&k)!=EOF)
{
if(n==-1 && k==-1)
break;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
cin >> grid[i][j];
}
dfs(0,k,n);
printf("%d\n",ans);
ans = 0;
for(int i=0;i<8;i++)
column[i] = 0;
}
return 0;
}