1. 程式人生 > >利用深度搜索法解決八皇后問題

利用深度搜索法解決八皇后問題

八皇后問題每行必須有一個皇后,所以,對棋盤深搜時,第一個皇后的位置不妨設為第一行,這樣只對第一行進行搜尋,同理,第二個皇后不妨設為第二行,以此類推。

下面附我的程式碼:

#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");

}