参考《算法竞赛入门经典》
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N=10;
int n;
int ar[N];
char s[N][N];
void out(){//字符输出
// for(int i=0;i<n;i++)printf("i:%d\n",ar[i]);
for(int i=0;i<n;i++){
for(int j=0;j<=n;j++){
if(ar[i]==j)putchar('Q');
else if(j==n)putchar('\n');
else putchar('.');
}
}
putchar('\n');
}
void DFS(int u){//组合型dfs?
//printf("%d\n",u);
if(u==n){//一组答案
out();
return ;
}
//抵达该层级说明u之前的所有已选择完毕
for(int i=0;i<n;i++){
int sg=1;
for(int j=0;j<u;j++){//检查
//对角线情况
if(ar[j]+j==i+u||ar[j]-j==i-u)sg=0;
//上方情况
if(ar[j]==i)sg=0;
}
if(!sg)continue;
ar[u]=i;
DFS(u+1);
}
}
int main (void){
cin>>n;
DFS(0);
return 0;
}