演算法分析之 8皇后問題

2021-10-12 14:35:48 字數 1357 閱讀 6901

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

使用到回溯演算法

高斯認為有76種方案。2023年在柏林的象棋雜誌上不同的作者發表了40種不同的解,後來有人用圖論的方法解出92種結果。

思路分析:

1)第乙個皇后先放第一行第一列

2)第二個皇后放在第二行第一列、然後判斷是否ok,如果不ok,繼續放在第二列、第三列、依次把所有列都放完,找到乙個合適

3)繼續第三個皇后,還是第一列、第二列…到第8個皇后也能放在乙個不衝突的位置,算是找到了乙個正確解4)當得到乙個正確解時,在棧回退到上乙個棧時,就會開始回溯,即將第乙個皇后,放到第一列的所有正確解,全部得到.

5)然後回頭繼續第乙個皇后放第二列,後面繼續迴圈執行1,2,3,4的步驟

理論上應該建立乙個二維陣列來表示棋盤,但是實際上可以通過演算法,用乙個一維陣列即可解決問題. arr[8] = //對應arr 下標 表示第幾行,即第幾個皇后,arr[i] = val , val 表示第i+1個皇后,放在第i+1行的第val+1列

**實現:

package sortdemo;

public class queue8

int array = new int[max];

static int count = 0;

static int judgecount = 0;

public static void main(string args)

//編寫乙個方法,放置第n個皇后

//特別注意: check 是 每一次遞迴時,進入到check中都有 for

(int i = 0; i < max; i++),因此會有回溯

private void check(int n)

//依次放入皇后,並判斷是否衝突

for(int i = 0; i < max; i++)

//如果衝突,就繼續執行 array[n] = i; 即將第n個皇后,放置在本行得 後移的乙個位置

}} //檢視當我們放置第n個皇后, 就去檢測該皇后是否和前面已經擺放的皇后衝突

/***

* @param n 表示第n個皇后

* @return

*/private boolean judge(int n)

} return true;

}//寫乙個方法,可以將皇后擺放的位置輸出

private void print()

system.out.println()

;}}

8皇后問題演算法

八皇后問題 回朔法 該演算法的思路是 每個皇后先後從第一列出發,找合適自己的列的位置。當找到合適的位置 則下乙個皇后出發。如果沒找到則回朔到上乙個皇后繼續找,知道8個皇后全有合適位置為止。include define max 8 int match int line,int p 檢測是否符合條件 記...

演算法學習之8皇后問題

8皇后問題是高斯提出來的乙個問題,在乙個8 8棋盤上,8個棋子不在同一行同一列,和同乙個對角線上的擺放方式有幾種,我們一般才有回溯加剪枝的方法求解。回溯剪枝法也是很多公司筆試題中簡單題經常考的。include include include include include using namespa...

8皇后問題

會下西洋棋的人都很清楚 皇后可以在橫 豎 斜線上不限步數地吃掉其他棋子。如何將8個皇后放在棋盤上 有8 8個方格 使它們誰也不能被吃掉!這就是著名的八皇后問題。對於某個滿足要求的8皇后的擺放方法,定義乙個皇后串a與之對應,即a b1b2.b8,其中bi為相應擺法中第i行皇后所處的列數。已經知道8皇后...