資料結構實驗題:用棧求解n皇后問題
阿新 • • 發佈:2018-11-12
和用棧求解迷宮問題思路相似,特此記錄下。
程式碼:
#include <iostream> #include <stdlib.h> #include <cmath> #include <algorithm> using namespace std; #define maxn 100 int n,num=1;//num定義為全域性變數 typedef struct node { int col[maxn];//col[i]表示第i個n皇后的列數,(i,col[i])即為座標 int top; }stacktype; void display(stacktype st) { printf(" 第%d個解為:",num++); for(int i=1;i<=n;i++) printf("(%d,%d) ",i,st.col[i]); printf("\n"); } bool place(stacktype st,int k,int j) { int i=1; if(k==1) return true;//第一個皇后直接放入,沒有任何衝突 while(i<=k-1)//遍歷前k-1個皇后,判斷第k個皇后是否可以放在(k,j)處 { if((st.col[i]==j)||(abs(st.col[i]-j)==abs(i-k))) return false; i++; } return true; } void queen(int n) { int k; bool find; stacktype st; st.top=1; st.col[st.top]=0; while(st.top!=0) { k=st.top;//記錄棧頂皇后的個數 find=false; for(int j=st.col[k]+1;j<=n;j++)//回溯時要遍歷當前列後面的列數,且下一個皇后的初始化列數為0 if(place(st,k,j)) { st.col[k]=j; find=true; break;//找到第一個可以放入的位置 } if(find) { if(k==n) { display(st);//每次能放完n個皇后都要輸出 } else { st.top++; st.col[st.top]=0; } } else st.top--;//回溯,最後while結束時是當第一個皇后放在(1,n)位置時無法將n個皇后都放下,st.top=0 } if(num==1) printf(" 此%d皇后問題無解!\n",n); } int main() { printf("n皇后問題求解:n="); scanf("%d",&n); if(n>20) printf("n必須小於20\n"); else { printf(" %d皇后問題的求解情況如下:\n",n); queen(n); } return 0; }