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

2021-09-29 00:07:53 字數 1336 閱讀 8474

國際西洋棋棋手馬克斯貝瑟爾於2023年提出:在8x8格的西洋棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處在同一行、同一列或者同一斜線上,問有多少種擺法(92).

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

2.第二個皇后放在第二行第一列,然後判斷是否ok,如果不ok,繼續放在第二列、第三列,找合適的

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

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

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

建立乙個二維陣列表示棋盤。arr下標表示第幾行,即第幾個皇后,arr[i]=val,val表示i+1個皇后,放在第i+1行的i+1列

package com.atguigu.recursion;

public

class

queue8

int[

] array =

newint

[max]

;static

int count =0;

static

int judgecount =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個皇后,就去檢測該皇后是否和前面已經擺放的皇后衝突

/** *

* @param n 第n個皇后

* @return

*/private

boolean

judge

(int n)

}return

true;}

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

private

void

print()

system.out.

println();}}

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

八皇后 問題,是乙個古老而著名的問題,是 回溯演算法 的典型案例。該問題是國際西洋棋棋手馬克斯 貝瑟爾於1848年提出 在8 8格的西洋棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行 同一列或同一斜線上,問有多少種擺法。高斯認為有76種方案。1854年在柏林的象棋雜誌上不同的作者...

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

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

八皇后問題(遞迴,回溯)

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