题目入口
题目分析:
这里使用一维数组保存第i行放置在哪列,还有个一维数组来判断该列是否已有元素;
每次遍历,是在t行放置,所以t-1行已放好,abs(j-t)==abs(i-a[j])来判断是否和其他已经放置的成对角线关系。
AC代码:
#include<bits/stdc++.h>
using namespace std;
int n,ans=0;
int a[15];
bool sign[15];
void dfs(int t){
if(t>n){
ans++;
if(ans<4){
for(int i=1;i<=n;i++){
cout<<a[i]<<" ";
}
cout<<endl;
}
}
for(int i=1;i<=n;i++){
if(sign[i]) continue;
bool flag=true;
for(int j=1;j<t;j++){
if(abs(j-t)==abs(i-a[j])){
flag=false;
}
}
if(flag){
a[t]=i;
sign[i]=true;
dfs(t+1);
sign[i]=false;
}
}
}
int main(){
memset(a,0,sizeof(a));
memset(sign,0,sizeof(sign));
cin>>n;
dfs(1);
cout<<ans;
return 0;
}