在8*8大小的西洋棋棋盤上擺放8個皇后棋子,8個皇后不能互相攻擊,即不能在同行同列同斜線上,問共有多少種擺法?
處理此類問題不可暴力列舉,巧用遞迴演算法結構和回溯演算法思想,能夠快速解決問題。
第乙個皇后放第一列位置1。
第二個皇后放第二列位置1,有衝突,往後放。
當三個…
放到第n個(n<8),後續還有未放置的皇后(擺放未完成)。這時候就需要回溯了,改變已放置的皇后位置。
當找到一種解法,輸出序列,擺法加1。跳出當前方法,回到上一級呼叫,再回溯找其他解法。
class
queue8
}return
true;}
//擺放方法
public
void
place
(int n)
for(
int i=
0;i}//輸出方法
public
void
print()
system.out.
println()
;}}//呼叫方法
class
main
}
結果共列印92種
這個問題看似不好解決,但是**很簡潔。主要就是兩個方法
判斷某個位置能不能放皇后,兩個條件判斷在不在同一列或者同一斜線,判斷在不在同一斜線只需兩點間的橫縱間距是否相等。
擺放方法就是遞迴呼叫和回溯的設計,遞迴就是滿足一定條件就呼叫本身。回溯的體現就是在遞迴呼叫本身的同時滿足一些條件後跳出當前方法或方法執行完畢,繼續執行上乙個方法的後續操作。
資料結構演算法 八皇后問題
八皇后問題,是乙個古老而著名的問題,是回溯演算法的典型案例。該問題是國際西洋棋棋手馬克斯 貝瑟爾於1848 年提出 在 88 格的西洋棋上擺放八個皇后,使其不能互相攻擊,即 任意兩個皇后都不能處於同一行 同一列或同一斜線上,問有多少種擺法 92 理論上應該建立乙個二維陣列來表示棋盤,但是實際上可以通...
資料結構與演算法 c 八皇后問題
八皇后問題 在n n格的西洋棋上擺放n個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行 同一列或同一斜線上,問有多少種擺法。輸入 n的大小,即棋盤的大小 輸出 棋盤 用1表示皇后.0表示空著的棋盤 include include include include define max boar...
資料結構 八皇后演算法
八皇后的基本要求是這樣的 在乙個8 8的矩陣上面放置8個物體,乙個矩陣點只允許放置乙個物體,任意兩個點不能在一行上,也不能在一列上,不能在一條左斜線上,當然也不能在一條右斜線上。參考網上資料改寫 如下 include include include includeusing namespace st...