八皇后問題,是乙個古老而著名的問題,是
回溯演算法的典型案例。該問題是國際西洋棋棋手馬克斯·貝瑟爾於2023年提出:在8×8格的西洋棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行、同一列或同一斜線上,問有多少種擺法。
高斯認為有76種方案。2023年在柏林的象棋雜誌上不同的作者發表了40種不同的解,後來有人用圖論的方法解出92種結果。計算機發明後,有多種計算機語言可以解決此問題。
這個問題可是難住了無數的數學家們,上面提到的偉大的數學家高斯,他也只算出了70多種,而今天我們將超越高斯,哈哈,有沒有很激動呢~
計算機的好處就在於運算速度非常之快,我們利用這一點有乙個非常好的演算法技巧就是:回溯演算法。
回溯演算法也叫試探法,它是一種系統地搜尋問題的解的方法。回溯演算法的基本思想是:從一條路往前走,能進則進,不能進則退回來,換一條路再試。用回溯演算法解決問題的一般步驟為:
1、定義乙個解空間,它包含問題的解。
2、利用適於搜尋的方法組織解空間。
3、利用深度優先法搜尋解空間。
4、利用限界函式避免移動到不可能產生解的子空間。
問題的解空間通常是在搜尋問題的解的過程中動態產生的,這是回溯演算法的乙個重要特性
度娘說的很多,其實關鍵內容很簡單也很好理解:就是選中一條路向前走,碰壁了就回頭換乙個方向,直到把所有的方向都走遍。
八皇后就是要用到這個思想;把每乙個方案都嘗試,找到可行的進行記錄。
具體來說需要兩個主要函式,
1.判斷:判斷皇后的對角線和列是否已經擺放皇后,如果沒有就返回0,有就返回1.
#include int a[8][8];
int count=1;
void show()
printf("************************\n");
count++;
}int jugde(int n,int m)
for(k=1;k<8-m;k++)
return 1;
}void eightqueen(int i)
a[i][j]=0;}}
int main()
結果是92種,如果你得到的不是92種而是別的數值,那麼80%的可能性你的judge函式出問題了,判斷的時候一定要注意陣列越界問題。 簡單,卻不簡單的 約翰 馮 諾依曼
上次我們講述艾倫 麥席森 圖靈的故事時曾經說過,圖靈同學有乙個 計算機之父 的稱號,那麼計算機之母是誰呢?其實計算機是無性繁殖的,它沒有媽,卻有兩個爸,計算機之父 除了圖靈還有乙個。這一位 計算機之父 的名氣比圖靈大得多,無論是計算機科班出身的專業人士,還是初入門的新人,無人不知他的大名。就連那些對...
數值的整數次方 簡約而不簡單
1 題目 實現函式double power double base,int exponent 求base的exponent次方。不得使用庫函式,同時不需要考慮大數問題。2 考慮最簡單的解法 double power double base,int exponent 缺點 沒有考慮輸入的指數expon...
八皇后問題(簡單回溯)
隨心而記,以供追憶 1,問題描述 八皇后問題是乙個古老而著名的問題,是回溯演算法的典型例題。該問題是十九世紀著名的數學家高斯1850年提出 在8x8格的西洋棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行 同一列或同一斜線上,問有多少種擺法。2,解決方式 由於本問題只有八皇后擺放,...