标签:int res dfs 棋子 kuangbin 打卡 include line acwing
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;
}
标签:int,res,dfs,棋子,kuangbin,打卡,include,line,acwing 来源: https://blog.csdn.net/qq_51676853/article/details/122691515
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。