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

八皇后的非遞迴問題

//八皇后問題

/*八皇后是一個 8*8  64個方塊     要求:1:每一行只能放一個放一個皇后           2:每一列只能放一個皇后           3:左斜線(15),右斜線(15)上只能有一個皇后,並且放夠8個皇后    演算法:宣告三個陣列和一個棧,三個陣列分別對應列,左斜線和右斜線,每行遍歷一回,判斷列,左右斜線是否有皇后,若無,則放,     若有,則,下一列,直到棧滿結束,一組解,在棧中輸出 */ //非遞迴,只求一個解  

#include<stdio.h>
#include<stdlib.h>

int col[8] = { 0,0,0,0,0,0,0,0};//檢視那一列是否放皇后
int right[15] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 };//每一條斜線
int left[15] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 };
int Q[8];
void EightQueen()
{
    int top=-1, i=0, j=0;
    while (top != 7)
    {
        //每一行的八列
        for (; j < 8; j++)
        {
            if (!col[j] && !left[i + j] && !right[7 - i + j])
            {
                Q[++top] = j;
                col[j] = left[i + j] = right[7 - i + j] = 1;
                i++;
                j = 0;
                break;
            }
        }
        if (j == 8)
        {
            i--;
            col[j] = left[i + j] = right[7 - i + j] = 0;
            j++;
        }
    }
}

void printEightQueen()
{
    //輸出一組解
    for (int i = 0; i < 8; i++)
        printf("%d,%d\t", i, Q[i]);
}

int main(void)
{
    EightQueen();
    printEightQueen();
    return 0;

}