數據結構上機作業3:棧——八皇后

問題描述:
用棧來求解N皇后問題
作者:何知令

完成時間:2017年5月21日

代碼:

/*
問題描述:
用棧來求解N皇后問題
作者:何知令
完成時間:2017年5月21日
*/
#include <stdio.h>
#include <stdlib.h>
typedef struct
{
    int data[20];
    int top;
} sqstack;
sqstack st;
void push(int col)//進棧
{
    st.top++;
    st.data[st.top]=col;
}
void pop()//出棧
{
    st.top--;
}
int output(int k,int n)//輸出棧內所有元素
{
    int i,j;
    k++;
    printf("第%d個解:\n",k);
    for(i=0; i<n; i++)
    {
        for(j=0; j<st.data[i]; j++);
        printf("<%d,%d> ",i,j);
        for(j=n-1; j>st.data[i]; j--);
    }
    printf("\n");
    return k;
}
int judgement()//判斷該位置是否可以排放皇后
{
    int i;
    for(i=0; i<st.top; i++)
        if(st.data[st.top]==st.data[i]||abs(st.data[st.top]-st.data[i])==st.top-i)//如果當前皇后擺放位置與之前擺放的皇后處於同行同列或者同一斜線上則不能擺放在該位置,返回0
            return 0;
    return 1;
}
int placequeen(int row,int k,int n,int a[][n])//排放皇后
{
    int col;
    for(col=0; col<n; col++)
    {
        push(col);
        if(judgement())
        {
            if(row<n-1)
                k=placequeen(row+1,k,n,a);
            else
            {
                k=output(k,n);
            }
        }
        pop();
    }
    return k;
}
int main()
{
    int i,j,n,k=0;
    printf("皇后問題<n<20> n=");
    scanf("%d",&n);
    int a[n][n];
    for(i=0; i<n; i++)
        for(j=0; j<n; j++)
            a[i][j]=0;
    printf("%d皇后問題如下:\n",n);
    st.top=-1;
    placequeen(0,k,n,a);
    return 0;
}
程序運行結果展示:

知識點總結:棧,回溯

學習心得:難~慢慢學吧


發佈了302 篇原創文章 · 獲贊 43 · 訪問量 29萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章