為求簡單起見,先看四皇后問題。
所謂皇后問題,即任意兩個皇后不能處於同一列,也不能同時處於同一行,而且還不能處於同一對角線上。
我們以列為單位進行放置,即同一列僅放置乙個皇后,
1. 假設將皇后放於第一行第一列,則同一行,同一列,對角線上,均不能放置皇后
首先檢測對角線,將汙染位置用紅x表示。
接下來將同一行的汙染位置標記為紅x
2. 放置第二個皇后
先檢測主對角線,將汙染位置做標記。
接下來檢測輔對角線,標記汙染位置。
3. 第三個皇后無法放置,所以必須回溯,重新放置第二個皇后,但同樣無法的解。
所以回退到第一步,重新放置第乙個皇后的位置。
先檢測主對角線
然後是輔對角線
然後是同一行,並放置第二個皇后
主,輔對角線
同一行,並放置皇后
主,輔對角線,同一行,並放皇后
上圖即得到乙個解。
用乙個四原陣列記錄所得解,陣列中每個元素對應棋盤的一列。
例如,上述解可以表示為[2, 4, 1, 3],即第乙個皇后放在
第1列第2行,第二個皇后放在第2列第4行,第三個皇后放在
第3列第1行,第四個皇后放在第4列第3行。
我們用result來命名這個陣列,
首先有乙個檢測函式,檢測是否可以放置。原理:檢測同一行是否有皇后,並檢測主輔對角線上是否有皇后,
主輔對角線可根據斜率正負1來判斷。
bool place(int *result, int row)
return true;
}
引數row為正在處理的列,而result[row]為該皇后放置的行。檢測該皇后是否與已放置的皇后處於同一行,同時通過斜率檢測對角線是否有皇后。
int queen(int n)
//放置下一皇后
else if(result[row] <= n && row < n)
//放置失敗,回退到上一皇后,重新放置
else
}return total;
}
main函式及結果。
同樣,皇后問題也可以通過遞迴來解決。
bool place(int *result, int row)
return true;
}void recursion(int *result, int row, int n, int &total) }}
int queen(int 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...