八皇后问题(只输出八个皇后需改动n,我这个是参考的洛谷的P1219)
分析:
因为我们是分行来枚举的,所以每行是不会有冲突的。
我们可以用一个b1数组记录第i行是否被占,用一个b2数组记录x+y=i 的斜线是否被占,用一个b3数组记录x-y+15=i 的斜线是否被占(因为x-y可能是负数,所以加上15保证数组下标非负,当然你也可以试试加其他的数字,看看有没有变化)。
(上图黄色线条为点(1,1)被占用时不可放置的位置)
修改:竖着的黄色线条不存在(画错了)
代码来咯:
#include<bits/stdc++.h>
using namespace std;
int a[1000],n;//皇后的位置
int b1[1000],b2[1000],b3[1000];
void dfs(int x)//dfs深搜求出八皇后的所有情况(x表示第x行的皇后放置的位置)
{
if(x>n)//如果所有的皇后都放完了
{
for(int i=1;i<=n;i++)//输出每个皇后放置的位置
{
cout<<a[i]<<" ";
}
puts(" ");//换行
}
for(int i=1;i<=n;i++)//开始寻找放置皇后的方案
{
if(b1[i]==0&&b2[x+i]==0&&b3[x-i+15]==0)//如果可以放置
{
a[x]=i;//记录当前这个点
b1[i]=1;//标记占位
b2[x+i]=1;
b3[x-i+15]=1;
dfs(x+1);//搜索下一层
b1[i]=0;//取消占位
b2[x+i]=0;
b3[x-i+15]=0;
}
}
}
int main()
{
cin>>n;
dfs(1);//递归
return 0;
}