八皇后問題,是乙個古老而著名的問題。是回溯演算法的典型案例。該問題是國際西洋棋棋手馬克斯·貝瑟爾於2023年提出:在8x8格的西洋棋上擺放八個皇后,使其不能互相攻擊。即隨意兩個皇后都不能處於同一行、同一列或同一斜線上。問有多少種擺法。 高斯覺得有76種方案。2023年在柏林的象棋雜誌上不同的作者發表了40種不同的解。後來有人用圖論的方法解出92種結果。
求解過程:
採用遍歷的辦法,就是採用將每種情況都驗證的辦法終於找出問題的解,可是蠻力遍歷的話,須要遍歷的資料量太大,計算時間花費太大,所以在遍歷的過程中使用回溯法去掉很多不可能的分支,使問題的規模減小很多。
乙個可行解能夠這樣表示,用乙個陣列pos[n](n表示皇后的個數,八皇后即為8)表示每一行的皇后應該放在第幾列。從將第乙個棋子放在第1行的第1列開始一直遍歷完這個棋子固定在這個位置的全部解,然後再將第一行的棋子固定在第一行的第二列,再次遍歷全然部的解。直到第一行的棋子放在最後的一列,再遍歷完,那麼全部的解就都找出來了。由於程式**中已經凝視很具體,所以這裡不再反覆凝視了。
程式**例如以下:
#include #include using namespace std;
#define n 4 /*設定棋盤寬度*/
char pos[n]; /*每一行的這乙個棋子放置的位置:0~7*/
bitsetstat[n]; /*每一行的空暇位置(除去被行列對角線衝突的位置)*/
bitsetmask[n][n]; /*儲存回溯過程中曾經的狀態。由於在對每一行回溯時當時的狀態都不一樣
所以這個單元的大小是stat的n倍。以便儲存n行各自的初始狀態*/
int g_count; /*統計有多少種解法*/
void print() /*列印出當前的可行解*/
queen(n+1); /*本行探測完成,進行下一行的探測*/
for(j=n+1; j < n; j++)
stat[j] &= mask[n][j]; /*探測失敗。回退(返回上一次的狀態)*/}}
}int main(int argc, char* ar**)
{ int i,j;
g_count=0;
for(i=0;i程式執行結果截圖:
八皇后問題 遞迴 回溯法
八皇后問題,是乙個古老而著名的問題,是回溯演算法的典型案例。該問題是國際西洋棋棋手馬克斯 貝瑟爾於1848年提出 在8x8格的西洋棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行 同一列或同一斜線上,問有多少種擺法。高斯認為有76種方案。1854年在柏林的象棋雜誌上不同的作者發表了...
八皇后問題 遞迴回溯法
寫在前面 最開始接觸是資料結構老師在提到過,後來在學python時老師也有提到過,出於好奇就去思考了這個問題,當然,小白的我還是在b站懶貓老師的幫助下學會啦,真棒哈哈哈哈哈哈 這裡主要問題是在於判斷對角線上是否能放,表示上對角線d1,表示下對角線d2,根據老師所說加上自己的理解,同乙個下對角線上 n...
八皇后問題(遞迴,回溯)
八皇后問題是乙個以西洋棋為背景的問題 如何能夠在 8 8 的西洋棋棋盤上放置八個皇后,使得任何乙個皇后都無法直接吃掉其他的皇后?為了達到此目的,任兩個皇后都不能處於同一條橫行 縱行或斜線上。八皇后問題可以推廣為更一般的n皇后擺放問題 這時棋盤的大小變為n n,而皇后個數也變成n。當且僅當 n 1 或...