题目链接:点击这里
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
int n;
bool st[30];
int p[30]; // 排列
void dfs(int idx) // idx是行号
{
if(idx == n + 1) // 递归边界,即到达了第n+1行
{
for(int i = 1; i <= n; ++i)
{
for(int j = 1; j <= n; ++j)
{
if(j == p[i]) printf("Q");
else printf(".");
}
puts("");
}
puts("");
return;
}
for(int i = 1; i <= n; i++) // 有1~n列可选
{
if(st[i] == false) // 如果第i列没有放皇后
{
bool flag = true; // 则判断(idx,i)与之前的皇后(j,p[j])是否冲突
for(int j = 1; j < idx; j++)
{
if(abs(idx - j) == abs(i - p[j]))
{
flag = false; // 与之前的皇后在一条对角线,冲突
break;
}
}
if(flag)
{
p[idx] = i; // 令第idx行皇后的列号为i
st[i] = true; // 第i列被占用
dfs(idx + 1); // 递归处理第idx + 1行
st[i] = false; // 恢复现场
}
}
}
}
int main()
{
scanf("%d", &n);
dfs(1);
return 0;
}