AcWing 1432.棋盘挑战
题解:棋盘挑战题目描述思路分析代码实现题目描述题目链接:https://www.acwing.com/problem/content/1434/思路分析首先会有的思路是DFS代码实现#include <iostream>#include <cstring>#include <algorithm>using namespace std;const int N =
·
题目描述
题目链接:
https://www.acwing.com/problem/content/1434/
思路分析
- 首先会有的思路是DFS
- 每次搜索到底后回溯过程一定要恢复现场,当我们回溯的时候,原来这个图是什么样的,我们还要变回什么样
- 恢复现场目的: 当我们遍历完这条分支,去遍历下一条分支的时候,我们需要保证当前图其他条件的一致性,也就是遍历每一条分支的时候,当前图的状态都是一样的。保证每次遍历分支的公平性
代码实现
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 15;
int n;
bool col[N], dg[N * 2], udg[N * 2];
//col[N]--->判断某些位置到底能不能填 dg[N*2]--->判断对角线 dg[N*2]--->判断反对角线
int path[N], ans;//记录方案和答案的数量
void dfs(int x)//x表示行数
{
if (x > n)
{
ans ++ ;
if (ans <= 3)
{
for (int i = 1; i <= n; i ++ )//输出前三个方案
cout << path[i] << ' ';
cout << endl;
}
return;
}
for (int y = 1; y <= n; y ++ )//列是1到n枚举
if (!col[y] && !dg[x + y] && !udg[x - y + n])
{
path[x] = y;
col[y] = dg[x + y] = udg[x - y + n] = true;//标记一下 已经填了数了
dfs(x + 1);//搜索下一层
col[y] = dg[x + y] = udg[x - y + n] = false;//恢复现场
path[x] = 0;
}
}
int main()
{
cin >> n;//读入行数
dfs(1);//从第一行DFS
cout << ans << endl;
return 0;
}
更多推荐
已为社区贡献4条内容
所有评论(0)