1. 程式人生 > >八皇后問題的非遞迴演算法

八皇后問題的非遞迴演算法

#include<stdio.h>
#include<math.h>
int x[100];
bool place(int k)//考察皇后k放置在x[k]列是否發生衝突
{
    int i;
    for(i=1;i<k;i++)
        if(x[k]==x[i]||abs(k-i)==abs(x[k]-x[i]))
            return false;
        return true;
}


void queue(int n)
{
    int i,k;
    for(i=1;i<=n;i++)
        x[i]=0;
    k=1;
    while(k>=1)
    {
        x[k]=x[k]+1;   //在下一列放置第k個皇后
        while(x[k]<=n&&!place(k))
            x[k]=x[k]+1;//搜尋下一列
        if(x[k]<=n&&k==n)//得到一個輸出
        {
            for(i=1;i<=n;i++)
                printf("%d ",x[i]);
            printf("\n");
        //return;//若return則只求出其中一種解,若不return則可以繼續回溯,求出全部的可能的解
        }
        else if(x[k]<=n&&k<n)
            k=k+1;//放置下一個皇后
        else
        {
            x[k]=0;//重置x[k],回溯
            k=k-1;
        }
    }
}


void main()
{
   int n;
   printf("輸入皇后個數n:\n");
   scanf("%d",&n);
   queue(n);
}