AcWing 1432. 棋盘挑战
原题链接
中等
作者:
Hustle
,
2021-06-02 15:31:02
,
所有人可见
,
阅读 276
DFS n皇后问题的变种 + 注释
:
#include <iostream>
using namespace std;
const int N = 15;
int n, ans;
int path[N]; // path[x]存放第x行能放的位置
bool col[N], dg[N * 2], udg[N * 2];
void dfs(int x) { // 按行搜索
if (x > n) { // 行搜索完后
ans ++ ; // 每次搜索完方案数+1
if (ans <= 3) { // 将最先搜索到的三种方案数输出(即为字典序最小的三种方案)
for (int i = 1; i <= n; ++ i) // 依次输出方案对应的序列
printf("%d ", path[i]);
cout << endl;
}
}
for (int y = 1; y <= n; ++ y) // 遍历列
if (!col[y] && !dg[x + y] && !udg[x - y + n]) { // 如果该列、该对角线、该反对角线都为放过数
path[x] = y; // 则将该位置放棋子,即记录这一行放的位置(第几列)-->path[x] = y
col[y] = dg[x + y] = udg[x - y + n] = true;
// 将该列、该对角线、该反对角线都标记为放过数的状态
dfs(x + 1); // 继续搜索下一行
path[x] = 0; // 恢复现场
col[y] = dg[x + y] = udg[x - y + n] = false; // 恢复现场
}
}
int main() {
cin >> n;
dfs(1); // 从第一行开始搜索且输出前三种方案
cout << ans << endl; // 输出前三种方案后继续输出总方案数
return 0; // 结束快乐~
}