思路是:dfs有两个参数 checkerNum 和 raw。checkerNum是棋子数量,raw是行号 。
先从第一行开始遍历,对第一行属于棋盘的每一列:开始下一行。
这一行处理完了,从下一行重新开始dfs。
#include <stdio.h>
int n, k, i, j, ans;
char maze[10][10];
int column[10];
void dfs(int checkerNum, int raw) { //checkerNum是棋子数量,raw是行号
if(checkerNum == k) {
ans++;
return;
}
if(raw >=n) return;
for(int t=0; t<n; t++) {
if(maze[raw][t] == '#' && column[t] == 0) {
checkerNum++;
column[t] = 1;
dfs(checkerNum, raw + 1); //继续下一行
column[t] = 0;
checkerNum--;
}
}
dfs(checkerNum, raw + 1); //第raw行结束。从下一行重新开始
}
int main() {
while(~scanf("%d%d", &n, &k)) {
if(n==-1 && k==-1) break;
getchar();
for(i=0; i<n; i++) {
for(j=0; j<n; j++)
scanf("%c", &maze[i][j]);
getchar();
}
ans = 0;
dfs(0, 0); //从第一行开始
printf("%d\n", ans);
}
return 0;
}