AcWing 1114. 棋盘问题
原题链接
简单
作者:
saih
,
2021-03-27 15:14:22
,
所有人可见
,
阅读 297
#include <iostream>
using namespace std;
const int N = 10;
char a[N][N];
int n, k;
// cur 记录当前放置棋子的数目, ans 方案数
int cur, ans;
// 检索该列有无棋子
bool col[N];
void dfs(int row){
// 递归出口设置
if(cur == k){
ans += 1;
return;
}
if(row >= n) return;
// 该行不放置棋子
dfs(row + 1);
// 该行放置棋子
for(int i = 0; i < n; i ++){
if(a[row][i] == '#' && ! col[i]){
cur += 1;
col[i] = true;
dfs(row + 1);
// 恢复现场
cur -= 1;
col[i] = false;
}
}
}
int main(void){
while(scanf("%d%d", &n, &k)){
if(n == -1 && k == -1) break;
cur = ans = 0;
string str;
for(int i = 0; i < n; i ++){
cin >> str;
for(int j = 0; j < n; j++)
a[i][j] = str[j];
}
//从第0行开始检索
dfs(0);
printf("%d\n", ans);
}
return 0;
}