​题目传送门​

843. n-皇后问题_c++

#include <bits/stdc++.h>

using namespace std;

const int N = 20; //2*N-1,对角线的最长长度,比如N=8,那么对角线是15

int n;
char g[N][N]; //方案的摆放方法
bool col[N], dg[N], udg[N];//col[N]列,dg[N]对角线 udg[N]反对角线 是否已经放置了皇后

void dfs(int u) {
//如果到达了终点
if (u == n) {
for (int i = 0; i < n; i++) puts(g[i]); // 输出字符串
puts("");
return;
}
//现在是第u行
for (int i = 0; i < n; i++)//这里是列的意思
if (!col[i] && !dg[u + i] && !udg[n - u + i]) { //这块数组下标的含义看一下drawio的示意图
g[u][i] = 'Q'; //放上皇后
col[i] = dg[u + i] = udg[n - u + i] = true; //标识已放置

dfs(u + 1); // 尝试下一行

col[i] = dg[u + i] = udg[n - u + i] = false; //恢复现场
g[u][i] = '.';
}
}


int main() {
ios::sync_with_stdio(false);
cin >> n;
//初始化棋盘
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
g[i][j] = '.';

dfs(0);
return 0;
}