首先我们来读题:
我们在每一排安排一个皇后,这样就可以直接确保不在一行,那一列,对角线,我们就可以用数组来进行判断,列和行,小伙伴们应该很好判断,那么对角线喃,我们可以发现从左上到右下,每一格他所对应的行数减去列数等于一个常数;比如1-1;2-2等;那么右上到左下,我们发现行数加列数等于一个常数,那么我们就可以通过这个来判断他们是否在同意对角线;
因为要进行把前三次的方案,放在那一列打印出来,我们就只需要再写一个打印代码;
上代码:
#include<bits/stdc++.h>
using namespace std;
int n,tot=0;
int vis[1010],a[1010],vis1[1010],vis2[1010];
void dfs(int dep){
if(dep>n)
{
tot++;打印个数;
if(tot<=3){
for(int i=1;i<=n;i++){
printf("%d ",a[i]);//进行打印;
}
printf("\n");
}
return;
}
else {
for(int i=1;i<=n;i++){
if((!vis[i])&&(!vis1[i+dep])&&(!vis2[i-dep+n])){判断是否在同一列,同对角线;
vis[i]=1;vis1[i+dep]=1;vis2[i-dep+n]=1;//把这列,对角线表示一个用过了;
a[dep]=i;//记录位置
dfs(dep+1); //进行下一行的放皇后;
vis[i]=0;vis1[i+dep]=0;vis2[i-dep+n]=0;//回溯的实现,当发现不对立马回来;
}
}
}
}
int main()
{
cin>>n;
dfs(1);
printf("%d\n",tot);
return 0;
}
-----小白之作,一起在讨论区来探讨吧;