列舉法 八皇后

2021-06-17 18:18:44 字數 1170 閱讀 3310

《c程式設計競賽教程》例8.7   8皇后問題

問題描述:

八皇后問題,是乙個古老而著名的問題,是回溯演算法

的典型例題。該問題是十九世紀著名的數學家高斯

2023年提出:在8x8格的西洋棋

上擺放八個皇后

,使其不能互相攻擊,即任意兩個皇后都不能處於同一行、同一列或同一斜線上,問有多少種擺法。

問題分析:

這個問題是輸出「所有」滿足條件的放置方案,可以考慮採用列舉法實現。

首先考慮8個皇后在棋盤中的位置,皇后的位置是按棋盤的行列來表示的,行列的取值為1~8.由於皇后直接不能相互攻擊,所以在每行和每列上都有且僅有乙個皇后。

那麼問題的解就可以用乙個8位數表示,8位數的第k位為i,表示棋盤上的第k行的第j列放置了乙個皇后。

可能解的區間,因為任意兩個皇后不允許在同一行或者同一列,所以這個8位數中數字1~8應各出現一次,不能重複,因此,解的區間應為【12345678,87654321】。

約束條件:定義8位數儲存結構,每位表示棋盤的一行,乙個8位數能保證每行有乙個皇后。若每列只有乙個皇后,則該8位數的各位數字應互不相同,即1~8在8位數中各出現一次。檢查方法可以設定陣列f,f(x)為8位數中數字x出現的次數,若f(1)~f(8)均為1,即數字1~8在8位數中各出現一次,則滿足條件,否則,不是問題的解。

對條件不能在同一對角線上的判斷,設陣列g,若8位數中第k個數字為x,則有g[k] = x,即第k行,第x列有乙個皇后,若兩個皇后同處一條45°線上時,

則有:|g[j]-g[k]| == |j-k|。

**如下:

#include #include //檢查1-8是否各出現一次,若是,則返回1,否則返回0

int check_1_8( long m )

for ( flag=1, i=1; i<=8; i++ )

}return flag;

}//檢測是否在同一對角線上,若不在,返回1,否則返回0;

int check_dia( long m )

flag = 1;

for ( i=1; i<=7; i++ )}}

return flag;

}int main()

printf("\n%d\n", n); //輸出總的方案數

return 0;

}

C 列舉法解決八皇后問題

用列舉法解8皇后問題 在西洋棋棋盤上放8個皇后,西洋棋棋盤共有8行8列,皇后可以吃掉與之同行同列以及同一對角線上的其他皇后。為了讓她們共存,請編寫演算法找出各種放置方法。題目要求用列舉法解決該問題,但是若完全用迴圈實現起來過於繁瑣,所以這裡使用遞迴呼叫求解,用for迴圈的思路與之相同。可以用一維陣列...

回溯法 八皇后

題目大意 八皇后問題是乙個以西洋棋為背景的問題 如何能夠在 8 8 的西洋棋棋盤上放置八個皇后,使得任何乙個皇后都無法直接吃掉其他的皇后?為了達到此目的,任兩個皇后都不能處於同一條橫行 縱行或斜線上。八皇后問題可以推廣為更一般的n皇后擺放問題 這時棋盤的大小變為n1 n1,而皇后個數也變成n2。而且...

回溯法 八皇后問題(N皇后)

八皇后問題,是乙個古老而著名的問題,是回溯演算法的典型案例。該問題是國際西洋棋棋手馬克斯 貝瑟爾於1848年提出 在8 8格的西洋棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行 同一列或同一斜線上,問有多少種擺法。解題思路 1.在8 8的棋盤上進行逐行試探,每一行進行逐格試探,判...