經典回溯演算法 八皇后問題

2021-08-20 13:52:56 字數 2135 閱讀 8101



八皇后問題是由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個皇后,使任意兩個皇...