遞迴演算法解決八皇后問題

2021-10-06 18:46:00 字數 1680 閱讀 7700

在 8×8 格的西洋棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行、同一列或同一斜線上,問有多少種擺法。高斯認為有 76 種方案。1854 年在柏林的象棋雜誌上不同的作者發表了 40 種不同的解,後來有人用圖論的方法解出 92 種結果。(這個問題也一共有92種解法)

思路分析

第乙個皇后放置在第一行第一列

第二個皇后放置在第二行第一列,判斷是否滿足條件,如果不滿足,繼續放置在第三列、第四列,直到滿足條件為止

繼續放置後面的皇后,直到所有皇后放置的地方均滿足條件

當得到乙個正確的解之後,最後得到正解的棧會退回到上乙個棧,此時開始進行回溯,直到將第乙個皇后放置在第一列的所有正解全部得到

然後回頭繼續將第乙個皇后放置在第一行第二列,後面開始迴圈步驟1,2,3,4。直到所有的解全部得到,所有的解包括,將第乙個皇后放置在第三列、第四列直到第八列後面的皇后所有擺放均滿足條件

這裡說明一下,這裡八皇后擺放是在乙個棋盤上進行,理論上應該建立乙個二維陣列,但是通過演算法,以為陣列即可解決問題。

例子:八皇后中,用一維陣列解決,其中有乙個解為arr[8]=,在這裡arr[i]=value表示第i+1個皇后放在第i+1行的第value+1列即arr[0]=1表示第1個皇后在第1行的第1列;arr[1]=4表示第2個皇后在第2行的第5列。

接下來是**部分

public

class

queue8

,這裡arr[0]=0就表示第乙個皇后在第一行第一列的位置,

// arr[1]=4表示第二個皇后擺放的位置是在第二行的第5列,也就是說皇后最後的位置用一維陣列表示即為:arr[i]=val,表示第i+1個皇后

// 放在第i+1行的第val+1列上

int[

] arr =

newint[8

];int max =8;

// 先寫乙個列印的方法,將皇后擺放的位置列印出來,同時,沒列印乙個結果就將count++,最後顯示count有多少種解法

public

void

print()

system.out.

println()

;}// 寫乙個擺放皇后的方法

public

void

put(

int n)

//這裡將第乙個皇后在第一列所有正解全部得到後,就開始回溯,擺放第乙個皇后在第二列的所有正解。比如說第乙個皇后的在第一列

//的所有正解擺放完畢,遞迴就會向上一層開始回溯,直到回溯到最開始的迴圈部分,然後繼續走迴圈,i+1(將皇后放在後乙個位置)

//然後又開始進行遞迴,直到退出最開始的大迴圈,就代表所有正解全部得到

for(

int i =

0; i < max; i++)}

}// 八皇后的問題是將8的皇后的棋子擺在棋盤上,每個皇后不能在同一行同一列以及同乙個對角線上,所以寫乙個方法來判斷

// 第n個皇后的位置和前面n-1個皇后的位置受否衝突

public

boolean

judge

(int n)

}return

true;}

// 主方法測試

public

static

void

main

(string[

] args)

}

演算法 遞迴與回溯演算法解決八皇后問題

小結完整 在沒有其他演算法的加持下時,回溯演算法簡單來說,就是不斷試錯的過程。通過不斷向下乙個節點列舉尋找滿足條件的答案,當無法尋找到時,則返回至上乙個節點,然後繼續向下列舉。這句話可能看起來有點抽象,我們用乙個圖來演示一下。這是一張a村到e村的地圖。假設你從起點a出發到終點e 不是e1 在不知道路...

遞迴解決經典八皇后問題

public class recursiontest 列印問題 public static void test int n else 階乘問題 public static intfactorial int n else 迷宮問題 迷宮問題,求初始點到終點的一條通路 不一定是最小通路!牆體設為1,路徑...

回溯遞迴演算法 八皇后問題

前,有皇帝。就拿八皇后。由此產生的一系列問題,凌亂。由此產生的八皇后問題。哈哈 開玩笑 八皇后問題,是乙個古老而著名的問題,是回溯演算法的典型案例。該問題是國際西洋棋棋手馬克斯 貝瑟爾於1848年提出 在8x8格的西洋棋上擺放八個皇后,使其不能互相攻擊,即隨意兩個皇后都不能處於同一行 同一列或同一斜...