题目链接:https://www.acwing.com/problem/content/1434/
解题思路:用三个数组记下它的行,和两个对角线放过没,没有放过就能放,dfs出所有的方案,输出前三种。
#include<bits/stdc++.h>
using namespace std;
int n,s=0,a[15];
int col[150],l[150],r[150];
void dfs(int st){
if(st>=n+1){
s++;//记下所有方案数
if(s<=3){//只需要输出前三种方案
for(int j=1;j<=n;j++){
cout<<a[j]<<" ";
}
cout<<endl;
}
return ;
}
for(int i=1;i<=n;i++){
if(!col[i]&&!l[i+st]&&!r[n-i+st]){//行,和对角线有没有放过。
a[st]=i;//记下具体方案
col[i]=l[i+st]=r[n-i+st]=1;//放过了置1
dfs(st+1);
col[i]=l[i+st]=r[n-i+st]=0;
}
}
}
int main(){
cin>>n;
dfs(1);
cout<<s;
return 0;
}