資料結構和演算法 38 之八皇后問題

2021-10-05 12:13:45 字數 1552 閱讀 2524

學習資料結構和演算法的日常demo

八皇后問題介紹

八皇后問題,是乙個古老而著名的問題,是回溯演算法的典型案例。該問題是國際西洋棋棋手馬克斯.貝瑟爾於2023年提出:在8x8格的西洋棋上擺放八個皇后,使其不能互相攻擊,即:任意兩個皇后都不能處於同一行、同一列或同一斜線上,問共有多少種擺法

思路分析

第乙個皇后先放第一行第-列

第二個皇后放在第二行第一 列、然後判斷是否ok, 如果不ok,繼續放在第二列、第三列、依次把所有列都放完,找到乙個合適位置

繼續第三個皇后, 還是第一列、第二列…直到第8個皇后也能放在乙個不衝突的位置,即找到了乙個正確解

當得到乙個正確解時,在棧回退到上乙個棧時,就會開始回溯,即將第乙個皇后,放到第一列的所有正確解,全部得到.

然後回頭繼續第乙個皇后放第二列,後而繼續迴圈執行1.2.3.4的步驟

注:理論上應該建立乙個二維陣列來表示棋盤,但是實際上可以通過演算法用乙個一維陣列即可解決問題(因為每一行只允許存在乙個皇后),例如int arr= ,arr[i]=val則表示第i+1個皇后,放在第i+1行的第val+1列

**實現

public

class

queen8

.一行乙個皇后,所以存列就行

static

int[

] arr =

newint

[max]

;// 定**法計數器

static

int count =0;

public

static

void

main

(string args)

// 放置第n個皇后

// 注意:每一次進入check方法,都有for迴圈,因此產生回溯

private

static

void

check

(int n)

for(

int i =

0; i < max; i++

)// 如果衝突,就回到arr[n] = i+1;}}

// 當我們放置第n個皇后時,就去檢測該皇后是否和已經擺放的皇后衝突(回溯)

private

static

boolean

judge

(int n)

}return

true;}

private

static

void

print()

system.out.

println();}}

部分結果顯示

github:資料結構和演算法源**

資料結構和演算法遞迴之八皇后問題

package recursion public class queen8 寫乙個放置第n個皇后的方法 注意 check 每一次遞迴時進入到check中都有for int i 0 i private void check int n 依次放入皇后,並判斷是否衝突 for int i 0 i 如果衝突...

資料結構演算法 八皇后問題

八皇后問題,是乙個古老而著名的問題,是回溯演算法的典型案例。該問題是國際西洋棋棋手馬克斯 貝瑟爾於1848 年提出 在 88 格的西洋棋上擺放八個皇后,使其不能互相攻擊,即 任意兩個皇后都不能處於同一行 同一列或同一斜線上,問有多少種擺法 92 理論上應該建立乙個二維陣列來表示棋盤,但是實際上可以通...

資料結構演算法之python實現八皇后問題

class queeu def init self self.list 0 8 self.count 0def chek self,n if n 8 self.output 呼叫了多少次output就說明有多少種解法 print self.count return for i in range 8 ...