八/N皇后問題的詳解

八皇后問題,是一個古老而著名的問題,是回溯算法的典型案例。該問題是國際西洋棋棋手馬克斯·貝瑟爾於1848年提出:在8×8格的國際象棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行、同一列或同一斜線上,問有多少種擺法。

#include<iostream>
using namespace std;
int Queenarr[101];//這個數組是爲了存放皇后的位置,索引爲行號,
int n;
void NQueen(int k)
{
    if (k==n)
    {
        for (int i = 0; i < n; i++)
        {
            cout << Queenarr[i]+1<< " ";//+1 是因爲行號是從0開始的
        }
        cout << endl;
        return;
    }
    for (int i = 0; i < n; i++)//先將第一個皇后放在(0,0)的位置,這個結束並且輸出後,將其放在(0,1),依次往後
    {
        int j;
        for ( j = 0; j < k; j++)//將第K行與前K-1行的所有皇后進行列號對比,並且看是否在同一斜線上
        {
            if (Queenarr[j]==i||abs(Queenarr[j]-i)==abs(k-j))//如果滿足其中條件之一
            {
                break;//跳出循環,將皇后放在i+1上繼續重複上面步驟,看是否符合;
            }
        }
        if (j==k)//如果跳出循環,這個不會成立
        {
            Queenarr[k] = i;
            NQueen(k + 1);//進行第 K+1個皇后
        }
    }
}
int main()
{
    cin >> n;//n皇后
    NQueen(0);
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章