八皇后問題

2021-10-10 17:19:36 字數 1328 閱讀 9041

八皇后問題(英文:eight queens),是由國際西洋棋棋手馬克斯·貝瑟爾於2023年提出的問題,是回溯演算法的典型案例。

問題表述為:在8×8格的西洋棋上擺放8個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行、同一列或同一斜線上,問有多少種擺法。

八皇后問題演算法思路分析:

​ 1.第乙個皇后先放第一行第一列

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

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

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

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

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

**演示:

package com.wxit.recursion;

/** * @author wj

**/public

class

queue8

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

private

void

print()

system.out.

println()

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

//說明:

== array[n] 表示判斷第n個皇后是否和前面的n -1個皇后在同一列

- i) == math.abs(array[n] - array[i] 表示判斷第n個皇后是否和第i皇后在同一斜線上

private

boolean

judge

(int n)

}return

true;}

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

private

void

check

(int n)

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

for(

int i =

0; i < max; i++

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

}

八皇后問題

八皇后問題 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...