回溯法 八皇后問題 通俗易懂

2021-07-25 05:39:58 字數 1588 閱讀 2429

因為最近在學習演算法,所以今天在這裡對回溯法中的八皇后問題,進行一下歸納和總結,真的是用不能再通俗的語言去解釋了,看不懂請自絕與人民。

一、基本定義

二、適用範圍

可避免搜尋所有的可能解,適用於求解組合數較大的問題。

三、八皇后問題

問題:在8 x 8的棋盤上擺放8個皇后,而且八個皇后中的任意兩個是不能處於同一行、同一列、或同一斜線上。

【分析】

在8 x 8的棋盤上面放置8個皇后,而且還要不在不同一行和不在同一列,不在同一斜線上,所以每行肯定是得放乙個,但是位置就有好多的可能,只要滿足上面的要求即可。

設棋盤是乙個8 x 8矩陣,皇后i和皇后j的擺放位置分別為(i,xi)和(j,xj),要想這些皇后不在同一條斜線上,則需要這兩個座標點的斜率不等於 1 或 - 1。

也就是滿足|xj —xi | ≠ |j – i|

這裡採用迭代法解決八皇后問題,迭代就是迴圈**中參與運算的變數同時是儲存結果的變數,當前儲存的結果作為下一次迴圈計算的初始值。

迭代的代表性例子:實數累加

int v=1;

for(i=2;i<=100;i++)

【具體步驟】

1、這裡的八個皇后用k = 0,1,2,3,4,5,6,7來表示。

2、第乙個皇后放在8 x 8矩陣的(0 , 0)位置,也就是k = 0 ,x[k] = 0 ,這裡的k表示行和皇后k,x[k]表示列。

3、放完第乙個皇后之後,就要放置第二個皇后,因為不能在同一行,所以第二個皇后肯定在第二行放,這個時候到底在哪一列還沒有確定。

4、在確定第二個皇后到底在哪一列的時候,就要用到乙個判斷函式,這個函式主要是確定皇后不在同一列和同一斜線上。

check(int k),檢查皇后k是否會發生衝突。

intcheck(int k)

5、若發生了衝突【即皇后在同一列或同一斜線上】,就x[k]++,一直找到不發生衝突的位置或越界。

6、在找到皇后的位置之後,要先判斷一下是否皇后都找到了合適的位置。

7、若還有剩餘的皇后或發生越界,則分情況處理,若是還有剩餘的皇后,則k = k+1,擺放下乙個皇后,若是發生越界,則說明需要回溯,則x[k] = -1 ,k = k – 1

八皇后問題c++**:

#include

using

namespace

std;

#include

static

int *x; //用x陣列來存放解向量

static

int sum; //用sum變數來記錄有幾個解

int check(int k)

void queen(int n)

} if(sum == 0)

cout

<<"無解"

queen(n);

cout

<<"一共解的個數為 :"

0;}

八皇后問題(回溯法)

問題描述 八皇后問題是十九世紀著名數學家高斯於1850年提出的。問題是 在8 8的棋盤上擺放8個皇后,使其不能互相攻擊,即任意的兩個皇后不能處在同意行,同一列,或同意斜線上。可以把八皇后問題拓展為n皇后問題,即在n n的棋盤上擺放n個皇后,使其任意兩個皇后都不能處於同一行 同一列或同一斜線上。問題分...

回溯法 八皇后問題

八皇后問題是高斯於1850年提出的,這是乙個典型的回溯演算法的問題。八皇后問題的大意如下 西洋棋的棋盤有8 行 8 列共64個單元格,在棋盤上擺放八個皇后,使其不能互相攻擊,也就 是說任意兩個皇后都不能處於同一行 同一列或同一斜線上。問總共有多少種擺放方法,每一種擺 放方式是怎樣的。首先來分析八皇后...

八皇后問題 回溯法

在8 8格的西洋棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行 同一列或同一斜線上,問有多少種擺法 就拿四皇后來說吧 我們首先需要建立乙個一維陣列 這個陣列裡存放的就是皇后在該列合適的位置 這個陣列存放的是皇后放的行數,我們首先在第一列中找乙個可以放的地方,很明顯第乙個位置就可以...