1. 程式人生 > >多維陣列------八皇后問題

多維陣列------八皇后問題

/*
八皇后問題
在8*8的棋盤上擺放8個皇后,不能處於一排一列或者一斜線上,,使其不能相互攻擊
*/

#include <stdio.h>
#include <math.h>        //使用絕對值函式asb

const int N = 100;        //最多求100皇后問題
int x[N] = {-1};            //陣列初始化為-1

int Place(int k);
void PrintQueue(int n);

void Queue(int n)
{
    int k = 0,num = 0;
    while(k>=0)        //擺放皇后k,
    {
        x[k]++;            //在下一列擺放皇后k
        while(x[k] < n && Place(k) == 1)        //發生衝突
            x[k]++;                //皇后k試探下一列
        if(x[k] < n && k==n-1)
        {
            printf("第%d個解是:",++num);
            PrintQueue(n);
        }else if(x[k] <n && k<n-1)        //尚有皇后未擺放
            k = k+1;        //準備擺放下一個皇后
        else
            x[k--] = -1;        //重置x[k],回溯,重新擺放皇后k
    }
}

int Place(int k)            //觀察皇后k放置在x[k]列是否發生衝突
{
    for(int i=0;i<k;i++)
        if(x[i] == x[k] || abs(i+k) == abs(x[i] - x[k]))
            return 1;
        return 0;
}

void PrintQueue(int n)
{
    for(int i=0;i<n;i++)
        printf("%5d",x[i]+1);            //陣列下標從0開始,列印的列號從1開始
    printf("\n");
}

int main()
{
    int n;
    printf("請輸入皇后個數(n>=4)");
    scanf("%d",&n);
    Queue(n);
    return 0;

}