八皇后問題

2021-10-07 11:54:36 字數 2124 閱讀 4582

題目:存在8個皇后,要求任意兩個皇后都不能處於同一行、同一列或同一斜線上,問有多少種方法

思路:1.第乙個皇后先放在第一行第一列

2.第二個皇后放在第二行第一列,然後判斷是否ok(即是否衝突),如果不ok,繼續放在第二列、第三列、一次把所有列都放完,找到乙個合適

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

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

5.然後回頭繼續第乙個皇后放第二列,後面繼續迴圈執行1,2,3,4的步驟

說明:理論上應該建立乙個二維陣列來表示棋盤,但是實際上可以通過演算法,用乙個一維陣列既可解決問題 arr[8]=。0表示第一行的第一列,4表示第二行的第5列。。。。。arr下標表示第幾行,即第幾個皇后,arr[i]=val,val表示第i+1個皇后

先定義乙個max表明共有多少個皇后,然後在定義乙個陣列,儲存皇后存放的位置

//定義乙個max表示共有多少個皇后

int max =8;

//定義乙個陣列array,儲存皇后放置位置的結果,比如arr=

int[

] array=

newint

[max]

;//count用來計算

static

int count=

0;

//寫乙個方法,可以將皇后擺放的位置輸出

private

void

print()

system.out.

println()

;}

//檢視當我們防止第n個皇后,就去檢測該皇后是否和前面已經擺放的皇后衝突

//n表示放第n個皇后

private

boolean

judge

(int n)

}return

true

;}

//編寫乙個方法放置第n個皇后

//特別注意:check是每一次遞迴時,進入到check中都有for(int i=0;iprivate

void

check

(int n)

//依次放入皇后並判斷是否衝突

for(

int i=

0;i)//如果衝突的話,就繼續執行array[n] =i;即將第n個皇后放置在本行的後乙個位置

}}

public

static

void

main

(string[

] args)

整體:

public

class

queen8

int[

] array=

newint

[max]

;static

int count=0;

public

static

void

main

(string[

] args)

//編寫乙個方法放置第n個皇后

//特別注意:check是每一次遞迴時,進入到check中都有for(int i=0;iprivate

void

check

(int n)

//依次放入皇后並判斷是否衝突

for(

int i=

0;i)//如果衝突的話,就繼續執行array[n] =i;即將第n個皇后放置在本行的後乙個位置}}

//檢視當我們防止第n個皇后,就去檢測該皇后是否和前面已經擺放的皇后衝突

//n表示放第n個皇后

private

boolean

judge

(int n)

}return

true;}

//寫乙個方法,可以將皇后擺放的位置輸出

private

void

print()

system.out.

println()

;}}

八皇后問題

八皇后問題 ackarlix 八皇后問題是乙個古老而著名的問題,是回溯演算法的典型例題。該問題是十九世紀著名的數學家高斯 1850 年提出 在 8x8格的西洋棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行 同一列或同一斜線上,問有多少種擺法。高斯認為有 76種方案。1854 年在...

八皇后問題

include iostream.h int a 8 8 棋盤 int r 8 結果 int i,j int count 0 void init i j 0 int judge int x,int y for int mi x 1,mj y mi 1 mi for int ri x 1,rj y 1...

八皇后問題

package quess 由於八個皇后的任意兩個不能處在同一行,那麼這肯定是每乙個皇后佔據一行。於是我們可以定義乙個陣列columnindex 8 陣列中第i個數字表示位於第i行的皇后的列號。先把columnindex的八個數字分別用0 7初始化,接下來我們要做的事情就是對陣列columninde...