AcWing 843. n-皇后问题
原题链接
中等
作者:
CarpeDime
,
2021-02-20 17:35:09
,
所有人可见
,
阅读 305
C++ 代码
#include <cstdio>
const int N = 20;
int n;
char maze[N][N];
bool col[N], dg[N], udg[N];
void dfs(int x) {
if (x == n) {
for (int i = 0; i < n; ++ i) puts(maze[i]);
puts("");
return ;
}
/**
* dg[i + x]对角线坐标是通过计算截距得到的
* udg[n - x + i]反对角线为了保证数组下标部位负数加上棋盘大小获得相对偏移量
* 这里要明确,dfs是按列枚举,而for循环是按行枚举
* */
for (int i = 0; i < n; ++ i) {
if (!col[i] && !dg[i + x] && !udg[n - x + i]) {
col[i] = dg[i + x] = udg[n - x + i] = true;
maze[x][i] = 'Q';
dfs(x + 1);
col[i] = dg[i + x] = udg[n - x + i] = false;
maze[x][i] = '.';
}
}
}
int main() {
scanf("%d", &n);
for (int i = 0; i < n; ++ i) {
for (int j = 0; j < n; ++ j) {
maze[i][j] = '.';
}
}
dfs(0);
return 0;
}