n皇后 第一篇 粗略
int tu[10]={0};//因题目里n<=9;
void dfs(int t,int n);
int main() {
int n;
read(n);
if(n>=4)
dfs(1,n);
else
cout<<"no solute!";//这里取了个巧,3阶一下肯定是没有题解的所以就直接出答案。
return 0;
}
void dfs(int t,int n)//重头戏。t是代表第几个皇后也是代表第几行。
{
if(t>n)//能到这说明已经全部放完了,就只有把答案输出来就行了。
{
for(int i=1;i<=n;i++)
{
if(i!=n)//题目输出格式要求不用管。
cout<<tu[i]<<" ";
else
cout<<tu[i];
}
cout<<endl;
return ;
}
int f=0;//插个旗来表明这个皇后放的行不行。
for(int i=1;i<=n;i++)//这一层循环是枚举一行的每一个,也就是一行中的每一列。
{
tu[t]=i;//tu[t]上文中说了t是第几个皇后也就是第几行,而i就是第t个皇后放在了第t行第i列。
f=1;//这里先不管放的对不对,先把旗子插上,以助于后面判断。
for(int j=1;j<t;j++)//这就是回过头去判断现在放的位置与之前放的位置冲不冲突。
{
if(tu[j]==tu[t]||((fabs(t-j))==fabs(tu[j]-i)))
{
f=0;//冲突,把旗子拔掉,再试下一列,不冲突就直接放下一个皇后。
break;
}
}
if(f==1)dfs(t+1,n);
}
}
tu[j]==tu[t],这个是判断其在不在一列。
((fabs(t-j))==fabs(tu[j]-i)),这个是判断在不在对角线上,不知道为什么的自己举两个例子就是。