1. 程式人生 > >資料結構實驗題:用棧求解n皇后問題

資料結構實驗題:用棧求解n皇后問題

和用棧求解迷宮問題思路相似,特此記錄下。

程式碼:

#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;
}