题目传送门
#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;
}