publicclass
queen
public
void
printlocation()
}private
boolean isoccupied(int i,int
j)
public
void setlocation(int i,int j,int
flag)
public
void place(int
i)else
setlocation(i,j,unlocationoccupied);}}
}public
void start(int
i)
public
static
void
main(string args)
}
**來自 ,作者寫的真漂亮。
八皇后問題在放置每個皇后時要滿足沒有別的皇后在同一條線上,包括同一列(j),同一行(i),同一斜線(i-j-1+size),同一反斜線(i+j)。滿足這四個條件就可以放置。
第一步:從第0行開始,place(0),檢視第0行可以放置的列,方法是將所有的列遍歷一遍,碰見第乙個位置滿足上述條件的就放進去,然後改變此位置的狀態。
第二步:在place(0)中,遞迴呼叫place(1),在place(1)中,呼叫place(2)。。。這樣,當所有位置放置完成,輸出一種放置方法;另一種情況是到了後期無法放置;這兩種情況發生後,程式都會取消這一步的操作,返回上一步,繼續把沒遍歷完的j遍歷完成,搜尋所有可能情況。
比如當i=7時,如果j=2滿足條件,由於i已達最大,所以可以將所有位置資訊輸出,輸出之後,將i=7,j=2取消,從j=3開始,再次尋找合適情況。這樣,就可以把i=7的所有可能j的情況都遍歷到。完成後,退回上一步。
此時i=6,假設是以i=6,j=1的情況進入的i=7,那麼就從i=6,j=2開始遍歷j,滿足時,再次進入i=7,j再從1開始。這樣,把i=6的所有情況考慮完之後,退回i=5.這種方法稱為回溯法。
種情況:
* 找到乙個可能存在的正確的答案
* 在嘗試了所有可能的分步方法後宣告該問題沒有答案
在最壞的情況下,回溯法會導致一次複雜度為指數時間的計算。
演算法系列 N皇后問題
常規n皇后解決問題過程 一 問題描述 運用回溯法解題通常包含以下三個步驟 1 針對所給問題,定義問題的解空間 2 確定易於搜尋的解空間結構 3 以深度優先的方式搜尋解空間,並且在搜尋過程中用剪枝函式避免無效搜尋 通過上述的基本思路,我們可以將問題描述為 x j 表示乙個解的空間,j表示行數,裡面的值...
演算法 八皇后問題
問題簡述 八皇后問題是乙個以西洋棋為背景的問題 如何能夠在8 8的西洋棋棋盤上放置八個皇后,使得任何乙個皇后都無法直接吃掉其他的皇后?為了達到此目的,任兩個皇后都不能處於同一條橫行 縱行或斜線上。八皇后問題可以推廣為更一般的n皇后擺放問題 這時棋盤的大小變為n1 n1,而皇后個數也變成n2。而且僅當...
演算法 八皇后問題
問題描述 八皇后問題是乙個以西洋棋為背景的問題 如何能夠在8 8的西洋棋棋盤上放置八個皇后,使得任何乙個皇后都無法直接吃掉其他的皇后?為了達到此目的,任兩個皇后都不能處於同一條橫行 縱行或斜線上。八皇后問題可以推廣為更一般的n皇后擺放問題 這時棋盤的大小變為n n,而皇后個數也變成n。當且僅當n 1...