A - 棋盘问题
思路:不能搞双重循环嵌套,要注意可以跳过某行
代码
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
int n, k, res, cnt;
char a[10][10];
bool vis[10];
void dfs (int x) {
if (res == 0) {
cnt ++;
//cout << cnt << endl;
return ;
}
if (x == n ) {
return ;
}
for (int j = 0; j < n; j ++) {
if (a[x][j] == '.' || vis[j] )
continue;
vis[j] = true;
//a[x][j] = '$'; //放置
res --;
dfs (x + 1);
res ++;
vis[j] = false;
//a[x][j] = '#';
}
dfs (x + 1); //就是漏了这行
//这个是关键,因为 k <= m,因此可能有行不用放棋子,所以我们要手动舍弃行,直接进入下一行
}
int main () {
while (scanf ("%d %d", &n, &k) && n != -1 && k != -1) {
memset (vis, false, sizeof vis);
for (int i = 0; i < n; i ++)
scanf("%s", &a[i]);
res = k, cnt = 0;
dfs (0);
printf ("%d\n", cnt);
}
}