八皇后問題 回溯法

2021-09-01 02:31:28 字數 1244 閱讀 6879

在8×8格的西洋棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行、同一列或同一斜線上,問有多少種擺法

就拿四皇后來說吧

我們首先需要建立乙個一維陣列:這個陣列裡存放的就是皇后在該列合適的位置

這個陣列存放的是皇后放的行數,我們首先在第一列中找乙個可以放的地方,很明顯第乙個位置就可以放是滿足條件的,即大致皇后的方格如下:

a此時n=0,代表第一列已經放好了,並且放在了第一行,大致的圖形如下:0

a123

––––

02 a

12a3

54然後n=n+1=2,即在第三列放乙個皇后,可是經過測試發現1、2、3、4的位置都不滿足條件,這時候就要回溯帶n=1的時候了,即array[1]=2是不合適的,所以此時要繼續往下走了,即array[1]=3了,此時的情況大致如下了

n=103

a123

a4然後n=n+1=2,經過檢測發現第三行的1、3、4都是不合適的,所以第三列的應該放在2的位置,即array[2]=1;此時的位置應該大致如下:03

2 a1

a23a

4然後n=n+1=3,即要給第四列放上乙個皇后,但是經過比較發現1、2、3、4都是不合適的,這時候要回溯到n=2的時候了,當n=2的時候,經過比較可以發現,皇后已經沒有可以放得位置了,所以要回溯到n=1的時候了,當n=1的時候,由比較可以知此時已經沒有合適的位置了,那就只能再回溯到n=0的時候了,此時明顯array[0]=0是不合適的了,所以array[0]=1,大致的圖形如下:1

1a23

4然後n=n+1=1,此時發現1、2、3都不合適的,只有乙個4是合適的,故array[1]=3,

圖形大致如下:13

1a23a

4然後n=n+1=2,此時經過比較發現1的位置是合適的,故array[2]=0,圖形大致如下:13

0 a1

a23a

4然後n=n+1=3,即在第四列找合適的位置,經過比較發現第四列可以放在3的位置上,大致的圖形如下:13

02 a

aaa至此第一種情況已經找到了,然後就一直用回溯直到array[0]=3,然後就可以得出最後的結果了…

public class main 

public static void operate(int n )

else if(n}

} public static boolean panduan(int n)

}

八皇后問題(回溯法)

問題描述 八皇后問題是十九世紀著名數學家高斯於1850年提出的。問題是 在8 8的棋盤上擺放8個皇后,使其不能互相攻擊,即任意的兩個皇后不能處在同意行,同一列,或同意斜線上。可以把八皇后問題拓展為n皇后問題,即在n n的棋盤上擺放n個皇后,使其任意兩個皇后都不能處於同一行 同一列或同一斜線上。問題分...

回溯法 八皇后問題

八皇后問題是高斯於1850年提出的,這是乙個典型的回溯演算法的問題。八皇后問題的大意如下 西洋棋的棋盤有8 行 8 列共64個單元格,在棋盤上擺放八個皇后,使其不能互相攻擊,也就 是說任意兩個皇后都不能處於同一行 同一列或同一斜線上。問總共有多少種擺放方法,每一種擺 放方式是怎樣的。首先來分析八皇后...

八皇后問題 回溯法

當把問題分成若干步驟並遞迴求解時,如果當前步驟沒有合法選擇,則函 數將返回上一級遞迴呼叫,這種現象稱為回溯。正是因為這個原因,遞迴列舉演算法常被稱為 回溯法,應用十分普遍。在棋盤上放置8個皇后,使得它們互不攻擊,此時每個皇后的攻擊範圍為同行同列和同 對角線,要求找出所有解。最簡單的思路是把問題轉化為...