八皇后問題,乙個古老而著名的問題,是回溯演算法的典型案例。該問題由國際西洋棋棋手馬克斯·貝瑟爾於 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 或...