遞迴 八皇后問題(回溯演算法)

2021-10-02 00:19:05 字數 3026 閱讀 4141

問題:

在8x8的西洋棋的棋盤上擺八個皇后,使其不能夠互相攻擊。即任意兩個皇后不能夠處在同一行,同一列,或者是同一斜線,問有多少種擺法?92

思路分析

第乙個皇后放在第一行的第一列

第二個皇后從第二行第一列開始放,然後判斷可不可以,可以,就放第三個皇后,也從第三行第一列開始放;不可以在換下乙個位置,在判定

放第三個皇后,還是從第三行的每一列開始放,找到正確位置,開始放第四個。。。。一直放到第八個皇后,然後開始回溯,直到找到所有的解

然後第乙個皇后再換位置,放到第一行的第二列,再開始上述方法進行回溯,直到放到最後一列。

說明:理論上使用二維陣列模擬棋盤,但實際上可以通過演算法用乙個一維陣列來解決問題。arr[8] = 每個陣列元素的值代表放第幾列,陣列元素的順序對應著放在第幾行,如:arr = 1,表示第一行第二列。

**實現

package queen;

public

class

twodimension

//根據思路分析建造棋盤--- 放皇后----判定是否衝突---放皇后

//編寫方法來放置皇后

private

static

void

setqueen

(int hang)

for(

int i =

0;i <

8;i ++

)//當前的行列要是不成立就再換乙個,下一列

//其實我居然看了一下我才會做啊}}

//判斷哪個是否衝突的方法

private

static

boolean

isok

(int m)

else

if(i == m)

else

if(math.

abs(i- m)

==math.

abs(array[m]

- array[i]))

else

}return isflag;

}//傳入乙個引數比較好,並表示為行數,對應的陣列座標值即為對應的列數,傳入兩個太混亂

//傳入乙個,就不用判斷是否在同一行,因為你每一次都是再上上一行放的,本來就不在同一行

//演算法背後是數學在作用,不能死算,要學會找對應的規律

//方法門將皇后的位置列印出來

private

static

void

print()

system.out.

println();}}

執行結果:

分析:正常來說,進入了同列判定的語句,說明該位置與之前的棋子同列,故而不能放在那裡,換下一列。但是還進行判定,說明,一直走到底。問題在於,只要有乙個不符合條件的那就跳出迴圈。

修改:在對應的判斷同列,同斜線語句中加上跳出語句。

二次執行:

結果:

分析:成功了,當不正確的情況會自動回溯的,直到檢索到所有的結果

再次修改:增加可能結果的總數

最終**:

package queen;

public

class

twodimension

//根據思路分析建造棋盤--- 放皇后----判定是否衝突---放皇后

//編寫方法來放置皇后

private

static

void

setqueen

(int hang)

for(

int i =

0;i <

8;i ++

)//當前的行列要是不成立就再換乙個,下一列

//其實我居然看了一下我才會做啊}}

//判斷哪個是否衝突的方法

private

static

boolean

isok

(int m)

else

if(i == m)

else

if(math.

abs(i- m)

==math.

abs(array[m]

- array[i]))

else

}return isflag;

}//傳入乙個引數比較好,並表示為行數,對應的陣列座標值即為對應的列數,傳入兩個太混亂

//傳入乙個,就不用判斷是否在同一行,因為你每一次都是再上上一行放的,本來就不在同一行

//演算法背後是數學在作用,不能死算,要學會找對應的規律

//方法門將皇后的位置列印出來

private

static

void

print()

system.out.

println();}}

總結分析:

根據思路分析開始寫方法,放皇后,和判斷皇后是否合理兩個方法

在判定合理的過程總,一旦遇到非法的狀況,就跳出,輸入下一列,而不是從從頭遍歷到尾

在判定是否為同一斜線的過程中,學會發現一般性的簡單的常見的邏輯,而不是把所有情況都列出來

在書寫放皇后的方法中,先列一列一般不帶遞迴的語句,發現共同邏輯,再根據你所寫的語句提煉出遞迴

關於遞迴,必須具備三要素

確實用一維陣列更加方便一點,一維陣列有兩個量分別是陣列下標和當前下標的值,剛好可以表示當前的皇后的位置。而且在迴圈中還把列給單提出來,確實更加方便

錯誤補充:

忘記給行賦值對應的列時,就會什麼都不出!

錯誤**:

執行結果:

回溯遞迴演算法 八皇后問題

前,有皇帝。就拿八皇后。由此產生的一系列問題,凌亂。由此產生的八皇后問題。哈哈 開玩笑 八皇后問題,是乙個古老而著名的問題,是回溯演算法的典型案例。該問題是國際西洋棋棋手馬克斯 貝瑟爾於1848年提出 在8x8格的西洋棋上擺放八個皇后,使其不能互相攻擊,即隨意兩個皇后都不能處於同一行 同一列或同一斜...

八皇后問題 遞迴,回溯演算法

八皇后 問題,是乙個古老而著名的問題,是 回溯演算法 的典型案例。該問題是國際西洋棋棋手馬克斯 貝瑟爾於1848年提出 在8 8格的西洋棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行 同一列或同一斜線上,問有多少種擺法。高斯認為有76種方案。1854年在柏林的象棋雜誌上不同的作者...

八皇后問題 遞迴(回溯演算法)

國際西洋棋棋手馬克斯貝瑟爾於1848年提出 在8x8格的西洋棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處在同一行 同一列或者同一斜線上,問有多少種擺法 92 1.第乙個皇后先放在第一行第一列 2.第二個皇后放在第二行第一列,然後判斷是否ok,如果不ok,繼續放在第二列 第三列,找合適的...