利用深度搜索法解決八皇后問題
阿新 • • 發佈:2018-12-31
八皇后問題每行必須有一個皇后,所以,對棋盤深搜時,第一個皇后的位置不妨設為第一行,這樣只對第一行進行搜尋,同理,第二個皇后不妨設為第二行,以此類推。 下面附我的程式碼: #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"); }