acwing 1114.棋盘问题
传送门
- 题目大意:给你一个n * n的矩阵,其中里面包含两种字符’#‘和’.’,’#‘表示是棋盘,即可以放棋子,‘.’表示是空白区域不可以放棋子,现在给你k个棋子,要求每一行,每一列上不能有两颗棋子,问棋子有多少种摆放的可能
- 思路:直接使用dfs进行爆搜即可
- 代码如下
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int N = 10;
char g[N][N];
bool line[N];//因为每次直接处理下一行,所以只需要标记列即可
int n, k, m;
int res;
void dfs(int x)//按行进行摆放然后爆搜
{
if (m == k)
{
res ++;
return ;
}
else if (x == n) return ;
for (int i = 0; i < n; i ++)
if (!line[i] && g[x][i] == '#')
{
line[i] = true;//进行摆放
m ++;
dfs(x + 1);
m --;
line[i] = false;//恢复现场
}
dfs(x + 1);//此行也可以不放棋子
}
int main()
{
while (scanf("%d%d", &n, &k) || ( n != -1 && k != -1))
{
for (int i = 0; i < n; i ++) cin >> g[i];
res = 0;
m = 0;
memset(line, false, sizeof(line));
dfs(0);
printf("%d\n", res);
}
return 0;
}