用遞迴思想和回溯演算法解決八皇后問題 java實現

2021-09-16 23:18:32 字數 2778 閱讀 6172

八皇后問題,是乙個古老而著名的問題,是回溯演算法的典型案例。該問題是國際西洋棋棋手馬克斯·貝瑟爾於2023年提出:在8×8格的西洋棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行、同一列或同一斜線上,問有多少種擺法。 高斯認為有76種方案。2023年在柏林的象棋雜誌上不同的作者發表了40種不同的解,後來有人用圖論的方法解出92種結果。計算機發明後,有多種計算機語言可以解決此問題。

八皇后問題是乙個以西洋棋為背景的問題:如何能夠在 8×8 的西洋棋棋盤上放置八個皇后,使得任何乙個皇后都無法直接吃掉其他的皇后?為了達到此目的,任兩個皇后都不能處於同一條橫行、縱行或斜線上。八皇后問題可以推廣為更一般的n皇后擺放問題:這時棋盤的大小變為n1×n1,而皇后個數也變成n2。而且僅當 n2 ≥ 1 或 n1 ≥ 4 時問題有解。

八皇后問題最早是由國際西洋棋棋手馬克斯·貝瑟爾於2023年提出。之後陸續有數學家對其進行研究,其中包括高斯和康托,並且將其推廣為更一般的n皇后擺放問題。八皇后問題的第乙個解是在2023年由弗朗茲·諾克給出的。諾克也是首先將問題推廣到更一般的n皇后擺放問題的人之一。2023年,s.岡德爾提出了乙個通過行列式來求解的方法,這個方法後來又被j.w.l.格萊舍加以改進。

艾茲格·迪傑斯特拉在2023年用這個問題為例來說明他所謂結構性程式設計的能力。

八皇后問題出現在2023年代初期的著名電子遊戲第七訪客中。

也是最笨的方法,就是定義8個for迴圈。。。。

public

class

queen

public

void

backtrack

(int i)

else}}

}protected

void

showanswer()

else

} system.out.

println()

;}}public

static

void

main

(string[

] args)

}

package p03.遞迴;

/* * 第1行

* 1

* 第2行

* 3

* 第3行

* 5

* 第4行

* 2 x

* 第5行

* 4 x

* 第6行

* x

* 8 x

* 第6行

* x

* 7

* 第5行

* 2 x

* 第6行 x

* 4 x

* 第7行

* 6 x

* 第8行

* x

* 4

* ...

*

* 8

* 6

* 7

* 8

* 4

* 5

* 6

* 7

* 8

* 2

* 3

* 4

* 5

* 6

* 7

* 8

* */

public

class

eightqueen

//row [0,7]

private

static

void

eightqueen

(int row,

int[

] arr)

system.out.

println()

;}}else

}for

(int col=

0;col

) newarr[row]

[col]=1

;eightqueen

(row+

1, newarr);}

}}}private

static

boolean

nodangerous

(int row,

int col,

int[

] newarr)

}//左上

for(

int r=row-

1,c=col-

1;r>=

0&&c>=

0;r--

,c--)}

//右上

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

小結完整 在沒有其他演算法的加持下時,回溯演算法簡單來說,就是不斷試錯的過程。通過不斷向下乙個節點列舉尋找滿足條件的答案,當無法尋找到時,則返回至上乙個節點,然後繼續向下列舉。這句話可能看起來有點抽象,我們用乙個圖來演示一下。這是一張a村到e村的地圖。假設你從起點a出發到終點e 不是e1 在不知道路...

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

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

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

問題 在8x8的西洋棋的棋盤上擺八個皇后,使其不能夠互相攻擊。即任意兩個皇后不能夠處在同一行,同一列,或者是同一斜線,問有多少種擺法?92 思路分析 第乙個皇后放在第一行的第一列 第二個皇后從第二行第一列開始放,然後判斷可不可以,可以,就放第三個皇后,也從第三行第一列開始放 不可以在換下乙個位置,在...