問題:
在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,繼續放在第二列 第三列,找合適的...