八皇后问题每行必须有一个皇后,所以,对棋盘深搜时,第一个皇后的位置不妨设为第一行,这样只对第一行进行搜索,同理,第二个皇后不妨设为第二行,以此类推。
下面附我的代码:
#include<iostream>
using namespace std;
struct node1
{bool b[8][8]; };//棋盘模拟,不可以放皇后的地方值为0,可以为1;
struct node2
{ int x,y;};//记录放皇后的位置坐标
//node1 a[9];
node1 visited[9];
node2 zb[8];
int num;//记录有多少中方法
void print()//输出用的函数,坐标从0开始,到7/。
{printf("case%d: ",++num); for(int i=0;i<=7;i++)
{printf("%d,%d\t",zb.x,zb.y); }
cout<<'\n';
}
int x1,x2,x3,x4,y1,y2,y3,y4;
void vis(int x,int y,int step)//模拟记录在第step步时,把皇后放在x,y位置后,哪些地方就不能放皇后了。
{
x1=x;y1=y;
x2=x;y2=y;
x3=x;y3=y;
x4=x;y4=y;
visited[step]=visited[step-1];
for(int i=0;i<8;i++)
{
visited[step].b[x]=0;
visited[step].b[y]=0;
}
while(x1<8&&y1<8)
{
visited[step].b[x1][y1]=0;
x1++;y1++;
}
while(x4<8&&y4>=0)
{
visited[step].b[x4][y4]=0;
x4++;y4--;
}
}
void DFS(int step)
{
if(step==9)//step=9时,说明已经放了八个皇后了,该是输出的时候了。
print();
else
{
for(int j=0;j<8;j++)
if(visited[step-1].b[step-1][j])
{
zb[step-1].x=step-1;
zb[step-1].y=j;
vis(step-1,j,step);
DFS(step+1);
}
}
}
int main()
{
num=0;
memset(visited,1,sizeof(visited));
DFS(1);
system("pause");
}
利用深度搜索法解决八皇后问题
最新推荐文章于 2024-08-03 11:35:54 发布