因為最近在學習演算法,所以今天在這裡對回溯法中的八皇后問題,進行一下歸納和總結,真的是用不能再通俗的語言去解釋了,看不懂請自絕與人民。
一、基本定義
二、適用範圍
可避免搜尋所有的可能解,適用於求解組合數較大的問題。
三、八皇后問題
問題:在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格的西洋棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行 同一列或同一斜線上,問有多少種擺法 就拿四皇后來說吧 我們首先需要建立乙個一維陣列 這個陣列裡存放的就是皇后在該列合適的位置 這個陣列存放的是皇后放的行數,我們首先在第一列中找乙個可以放的地方,很明顯第乙個位置就可以...