資料結構 遞迴實現八皇后問題(回溯演算法)

2021-10-06 12:23:44 字數 1271 閱讀 9157

八皇后問題,乙個古老而著名的問題,是回溯演算法的典型案例。該問題由國際西洋棋棋手馬克斯·貝瑟爾於 1848 年提出:在 8×8 格的西洋棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行、同一列或同一斜線上,問有多少種擺法。高斯認為有 76 種方案。1854 年在柏林的象棋雜誌上不同的作者發表了 40 種不同的解,後來有人用圖論的方法解出 92 種結果

在這個8 * 8的棋盤放置8個皇后,不能同行、同列、同一斜線,計算有多少種可能

可以使用二維陣列表示棋盤,也可以使用一維陣列表示

array[n] = ,n表示第幾行的皇后,array[n]的值為該行第幾列

package com.company.recursion;

/** * @author zfk

* 遞迴解決八皇后問題

*/public

class

queen

/** * @param n

* 放置第n個皇后

* 每一層都有乙個for迴圈

*/private

void

check

(int n)

//依次放入皇后

for(

int i =

0;i < max;i++

)//如果衝突,就繼續執行該for迴圈,即放置在本行的後乙個位置}}

/** * @param n 放置的第n個皇后

* @return

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

*/private

boolean

judge

(int n)

}return

true;}

/** * 將皇后擺放的位置輸出

*/private

void

print()

system.out.

println();}}

很簡單就解決了八皇后問題,但實際上check方法執行了2057次

雖然回溯演算法實現了八皇后問題,但效率太差

本身遞迴效率就很差,解決八皇后問題的思想:有衝突解決衝突,沒有衝突往前走,無路可走往回退,走到最後是答案

類似與窮舉法,所以使用回溯演算法實現八皇后問題效率較低

後續,使用貪心演算法優化八皇后問題

資料結構 10 八皇后問題(回溯)

八皇后問題 author anqi date 2020 4 16 11 32 21 description public class queue8 int array newint max static int count 0 public static void main string args ...

資料結構與演算法 遞迴回溯 八皇后問題

package recurtion 八皇后問題 public class queue8 system.out.println param n 第幾個皇后 return 判斷放置的皇后是不是在同一列或者對角線,因為是按順序放置,因此不可能在同一行 public boolean judge int n ...

八皇后問題(遞迴,回溯)

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