#include <stdio.h>
#include <cstring>
#include <iostream>
#include <cmath>
using namespace std;
int x[20],sum=0,n;
//输出
void output(){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(x[i]==j) cout<<" Q";
else cout<<" *";
}
cout<<endl;
}
cout<<endl;
}
//检查是否是正确位置
int check(int k){
for(int i=1;i<=k-1;i++){
if((abs(x[k]-x[i])==abs(k-i))||(x[k]==x[i])) return 0;
}
return 1;
}
/****************非递归******************/
//搜索过程
void huisu(int n){
//sum=0;
memset(x,0,sizeof(x));
int k=1;//初始化从第一个开始 ,为行
while(k>0){
x[k]=x[k]+1;//列
while(x[k]<=n && !check(k)) x[k]=x[k]+1;
if(x[k]<=n){ //列 ,找到一个位置且合法
if(k==n){
output();//输出路径
sum++; //若为最后一个皇后,可行解个数加 1
}
else{ //不是最后一个
k++; //转到下一行,给下一个皇后找位置
x[k]=0; //从头开始搜索
}
}
else k--; //若第k行所有列都无法放置某皇后,回溯到上一行,到该行的的下一列
}
}
int main(){
sum=0;//皇后个数,可行路径个数
cin>>n;
int x[20]; // x[i]=k表示第 i 行的 第 k 个位置放置一个皇后
memset(x,0,sizeof(x)); //初始化为0
huisu(n); //搜索
printf("%d皇后问题共有%d种摆放方案\n",n,sum);
}
/*&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&*/
#include <stdio.h>
#include <cstring>
#include <iostream>
#include <cmath>
using namespace std;
int x[20],sum=0,n;
//输出
void output(){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(x[i]==j) cout<<" Q";
else cout<<" *";
}
cout<<endl;
}
cout<<endl;
}
//检查是否是正确位置
int check(int k){
for(int i=1;i<=k-1;i++){
if((abs(x[k]-x[i])==abs(k-i))||(x[k]==x[i])) return 0;
}
return 1;
}
/****************递归******************/
//搜索过程
void huisu(int t){
for(int i=1;i<=n;i++){//n个皇后 ,第一次从 1 开始
x[t]=i; //放到当前循环到的位置
if(check(t)){
if(t==n){ //最后一个皇后
output();
sum++;
}
else{
huisu(t+1); //继续下一个
}
}
}
}
int main(){
sum=0;//皇后个数,可行路径个数
cin>>n;
int x[20]; // x[i]=k表示第 i 行的 第 k 个位置放置一个皇后
memset(x,0,sizeof(x)); //初始化为0
huisu(1); //搜索
printf("%d皇后问题共有%d种摆放方案\n",n,sum);
}