还算是一个比较简单的搜索题,直接DFS,然后标记一下。
#include<cstdio>
#include<cstring>
const int MAXN = 10;
char G[MAXN][MAXN];
int vis[MAXN];
int n, k, m, ans = 0;
void dfs(int cur) {
if (k == m) {
// 棋子摆放完毕
ans++;
// 棋子摆放完成之后,没有必要再继续下一行了
return;
} else {
for(int i = 0; i < n; ++i) {
// cur 为当前行,i为cur行的第i个位置
if(vis[i] == 0 && G[cur][i] == '#'){
// 在该行第i处放置棋子,并继续在下一行放置
vis[i] = 1;
m++;
dfs(cur+1);
// 拿走当前行第i处的棋子,并尝试在该行其他位置放置
vis[i] = 0;
m--;
}
}
}
/* 因为棋子个数是可以小于棋盘行数的,所以在当前行放置棋子
的情况考虑之后,拿掉当前行的棋子,并尝试在下一行放置剩余棋子 */
if(cur < n - 1) {
// 尝试下一行
dfs(cur+1);
}
}
int main() {
while(scanf("%d%d", &n, &k) == 2) {
if(n == -1 && k == -1) {
break;
}
for(int i = 0; i < n; ++i) {
scanf("%s", G[i]);
}
m = 0, ans = 0;
memset(vis, 0, sizeof(vis));
dfs(0);
printf("%d\n", ans);
}
return 0;
}