八皇后問題是由19世紀數學家「搞死先生」(高斯先生)提出的,具體的問題是這樣的:
在西洋棋的棋盤中(有8×
8格)擺放
8個皇后,這八個皇后不能相互攻擊到(皇后的攻擊方向很廣:橫著,豎著,斜著都能攻擊),即
8個皇后不能處於同行、同列、同一正反對角線上,這樣就不能相互攻擊到了。那麼,這樣的皇后佔位的方法,一共有多少種呢?每一種是怎麼樣的呢?
解題思路
:
要在棋盤中放置8個皇后,可以乙個乙個皇后放置到棋盤裡,在放皇后的過程中,棋盤中被該皇后所能攻擊到的位置要作出標記,以提示之後將要放置的皇后不能在標記的位置中放置,在沒有被標記的地方,下乙個皇后是可以放置的。
假如8個皇后仍未全部放置到棋盤中,而棋盤卻被全部標記滿,則表示前面的皇后放置位置不能滿足要求,最好的解決辦法就是將在他之前的那乙個皇后位置改變。
以此類推,直到將所有的皇后都能放入到棋盤中為止。
根據解題思路,若不能放置皇后,則返回到它的前面乙個皇后中進行修改位置。這就是乙個回溯的過程,所以要解決八皇后擺放的問題,也就是可以用回溯演算法來解決問題。
對於要回溯問題的解決方法,可以用迭代法和遞迴法來實現。在這裡,我就用遞迴的方法來討論這個八皇后問題的解決方法。
思考解題難點
:
皇后佔位後,所攻擊的範圍如何標記?
這個標記的方法是乙個難點,也是乙個解題的突破口,有的朋友認為,可以用乙個二維陣列進行標記,剛開始二維陣列存放全為0,皇后佔位後,皇后的位置標記為
2,將該皇后所能攻擊到的範圍在此二維陣列中用
1來表示(
0表示未被標記,1和
2表示被標記而不能佔位)。
這中方法是可行的,也是可以實現的,但還有一種更好的解決方法,這種方法可以不用二維陣列,只用一維陣列進行標記即可,那麼我在這裡就只介紹用一維陣列進行標記的方法:
將8皇后放置在8×
8的棋盤中,所以每一行,每一列都最多只能有乙個皇后;
因此演算法執行過程中,可以用乙個遞迴過程的傳參進行每一行的擺放問題;
因為皇后的攻擊範圍是同行、同列、同一正反對角線的;
所以用3個一維陣列進行標記即可。(乙個列標記陣列,乙個正對角線標記陣列,乙個反對角線標記陣列)
為什麼不用二維陣列?
在這拿列的標記陣列舉例子,因為在標記的過程中,如果整列需要標記,那麼將這一列都標記為1,若沒被佔位,用
0標記即可,所以不需要用到二維陣列浪費空間。
剛開始陣列填充全為0,而後如果有佔位就用
1來表示。
那麼列標記與正、反對角線標記中的陣列下標有什麼關聯呢?
用i表示行,用
j表示列,那麼,正對角線、反對角線與i、
j的關係為:正對角線的下標正好是
i+j,反對角線的關係正好是
i-j+size-1
。而且正,反對角線的陣列長度應該為
2*棋盤邊長。(
size
是棋盤的邊長以及皇后的數目)
那麼由此可以寫**了:
package queen;
public class queen
// 判斷這個位置有木有被標記
private boolean isoccupied(int i, int j)
// 建立占領狀態
private void setstatus(int i, int j, int flag)
// 第一種顯示皇后佔位方法
private void printlocation1()
} // 第二種顯示皇后佔位方法
private void printlocation2()
for (int i : printlocation)
system.out.println();
} }// 在第i行擺放皇后
public void place(int i) else
setstatus(i, j, status_occupy_canceled);
}} }
public void start()
public static void main(string args)
}
經典回溯演算法(八皇后問題)
今天偶爾看到了乙個演算法問題 八皇后問題 回想一下還是在演算法課上學習過的,於是,自己總結了一下,寫了這篇日誌 演算法提出 在西洋棋棋盤上 8 8 放置八個皇后,使得任意兩個皇后之間不能在同一行,同一列,也不能位於同於對角線上。問共有多少種不同的方法,並且指出各種不同的放法。演算法思路 首先我們分析...
八皇后問題 經典回溯演算法
八皇后問題,是乙個古老而著名的問題,是回溯演算法的典型案例。該問題是國際西洋棋棋手馬克斯 貝瑟爾於1848年提出 在8 8格的西洋棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行 同一列或同一斜線上,問有多少種擺法。高斯認為有76種方案。1854年在柏林的象棋雜誌上不同的作者發表了...
八皇后問題(經典演算法 回溯法)
問題描述 八皇后問題 eight queens problem 是十九世紀著名的數學家高斯於1850年提出的。問題是 在8 8的棋盤上擺放八個皇后,使其不能互相攻擊。即任意兩個皇后都不能處於同一行 同一列或同一斜線上。可以把八皇后問題擴充套件到n皇后問題,即在n n的棋盤上擺放n個皇后,使任意兩個皇...