利用C語(yǔ)言解決八皇后問(wèn)題以及解析
前言
八皇后問(wèn)題是一個(gè)古老而著名的問(wèn)題。該問(wèn)題是19世紀(jì)著名的數(shù)學(xué)家高斯1850年提出:在一個(gè)8*8國(guó)際象棋盤(pán)上,有8個(gè)皇后,每個(gè)皇后占一格;要求皇后之間不會(huì)出現(xiàn)相互“攻擊”的現(xiàn)象,即不能有兩個(gè)皇后處在同一行、同一列或同一對(duì)角線上。問(wèn)共有多少種不同的方法?
回溯算法也叫試探法,它是一種搜索問(wèn)題的解的方法。冋溯算法的基本思想是在一個(gè)包含所有解的解空間樹(shù)中,按照深度優(yōu)先的策略,從根結(jié)點(diǎn)出發(fā)搜索解空間樹(shù)。算法搜索至解空間樹(shù)的任意結(jié)點(diǎn)時(shí),總是先判斷該結(jié)點(diǎn)是否肯定不包含問(wèn)題的解。如果肯定不包含,則跳過(guò)對(duì)以該結(jié)點(diǎn)為根的子樹(shù)的系統(tǒng)搜索,逐層向其祖先結(jié)點(diǎn)回溯。否則,進(jìn)入該子樹(shù),繼續(xù)按深度優(yōu)先的策略進(jìn)行搜索。回溯法在用來(lái)求問(wèn)題的所有解時(shí),要回溯到根,且根結(jié)點(diǎn)的所有子樹(shù)都已被搜索遍才結(jié)束。
八皇后問(wèn)題有很多中解法,其中使用回溯法進(jìn)行求解是其中一種。而回溯發(fā)也是最直接的一種解法,也較容易理解。
八皇后問(wèn)題的回溯法算法,可以采用一維數(shù)組來(lái)進(jìn)行處理。數(shù)組的下標(biāo)i表示棋盤(pán)上的第i列,a[i]的值表示皇后在第i列所放的位置。例如,a[1]=5,表示在棋盤(pán)的第例的第五行放一個(gè)皇后。程序中首先假定a[1]=1,表示第一個(gè)皇后放在棋盤(pán)的第一列的第一行的位置上,然后試探第二列中皇后可能的位置,找到合適的位置后,再處理后續(xù)的各列,這樣通過(guò)各列的反復(fù)試探,可以最終找出皇后的全部擺放方法。
八皇后問(wèn)題可以使用回溯法進(jìn)行求解,程序?qū)崿F(xiàn)如下:
#include<stdio.h> #define Queens 8 //定義結(jié)果數(shù)組的大小,也就是皇后的數(shù)目 int a[Queens+1]; //八皇后問(wèn)題的皇后所在的行列位置,從1幵始算起,所以加1 int main(){ int i, k, flag, not_finish=1, count=0; //正在處理的元素下標(biāo),表示前i-1個(gè)元素已符合要求,正在處理第i個(gè)元素 i=1; a[1]=1; //為數(shù)組的第一個(gè)元素賦初值 printf("八皇后的可能配置是:\n"); while(not_finish){ //not_finish=l:處理尚未結(jié)束 while(not_finish && i<=Queens){ //處理尚未結(jié)束且還沒(méi)處理到第Queens個(gè)元素 for(flag=1,k=1; flag && k<i; k++) //判斷是否有多個(gè)皇后在同一行 if(a[k]==a[i]) flag=0; for (k=1; flag&&k<i; k++) //判斷是否有多個(gè)皇后在同一對(duì)角線 if( (a[i]==a[k]-(k-i)) || (a[i]==a[k]+(k-i)) ) flag=0; if(!flag){ //若存在矛盾不滿足要求,需要重新設(shè)置第i個(gè)元素 if(a[i]==a[i-1]){ //若a[i]的值已經(jīng)經(jīng)過(guò)一圈追上a[i-1]的值 i--; //退回一步,重新試探處理前一個(gè)元素 if(i>1 && a[i]==Queens) a[i]=1; //當(dāng)a[i]為Queens時(shí)將a[i]的值置1 else if(i==1 && a[i]==Queens) not_finish=0; //當(dāng)?shù)谝晃坏闹颠_(dá)到Queens時(shí)結(jié)束 else a[i]++; //將a[il的值取下一個(gè)值 }else if(a[i] == Queens) a[i]=1; else a[i]++; //將a[i]的值取下一個(gè)值 }else if(++i<=Queens) if(a[i-1] == Queens ) a[i]=1; //若前一個(gè)元素的值為Queens則a[i]=l else a[i] = a[i-1]+1; //否則元素的值為前一個(gè)元素的下一個(gè)值 } if(not_finish){ ++count; printf((count-1)%3 ? "\t[%2d]:" : "\n[%2d]:", count); for(k=1; k<=Queens; k++) //輸出結(jié)果 printf(" %d", a[k]); if(a[Queens-1]<Queens ) a[Queens-1]++; //修改倒數(shù)第二位的值 else a[Queens-1]=1; i=Queens -1; //開(kāi)始尋找下一個(gè)滿足條件的解 } } }
輸出結(jié)果:
八皇后的可能配置是:
[ 1]: 1 5 8 6 3 7 2 4 [ 2]: 1 6 8 3 7 4 2 5 [ 3]: 1 7 4 6 8 2 5 3
[ 4]: 1 7 5 8 2 4 6 3 [ 5]: 2 4 6 8 3 1 7 5 [ 6]: 2 5 7 1 3 8 6 4
[ 7]: 2 5 7 4 1 8 6 3 [ 8]: 2 6 8 3 1 4 7 5 [ 9]: 2 6 1 7 4 8 3 5
[10]: 2 7 3 6 8 5 1 4 [11]: 2 7 5 8 1 4 6 3 [12]: 2 8 6 1 3 5 7 4
[13]: 3 5 7 1 4 2 8 6 [14]: 3 5 8 4 1 7 2 6 [15]: 3 5 2 8 1 7 4 6
[16]: 3 5 2 8 6 4 7 1 [17]: 3 6 8 1 4 7 5 2 [18]: 3 6 8 1 5 7 2 4
[19]: 3 6 8 2 4 1 7 5 [20]: 3 6 2 5 8 1 7 4 [21]: 3 6 2 7 1 4 8 5
[22]: 3 6 2 7 5 1 8 4 [23]: 3 6 4 1 8 5 7 2 [24]: 3 6 4 2 8 5 7 1
[25]: 3 7 2 8 5 1 4 6 [26]: 3 7 2 8 6 4 1 5 [27]: 3 8 4 7 1 6 2 5
[28]: 3 1 7 5 8 2 4 6 [29]: 4 6 8 2 7 1 3 5 [30]: 4 6 8 3 1 7 5 2
[31]: 4 6 1 5 2 8 3 7 [32]: 4 7 1 8 5 2 6 3 [33]: 4 7 3 8 2 5 1 6
[34]: 4 7 5 2 6 1 3 8 [35]: 4 7 5 3 1 6 8 2 [36]: 4 8 1 3 6 2 7 5
[37]: 4 8 1 5 7 2 6 3 [38]: 4 8 5 3 1 7 2 6 [39]: 4 1 5 8 2 7 3 6
[40]: 4 1 5 8 6 3 7 2 [41]: 4 2 5 8 6 1 3 7 [42]: 4 2 7 3 6 8 1 5
[43]: 4 2 7 3 6 8 5 1 [44]: 4 2 7 5 1 8 6 3 [45]: 4 2 8 5 7 1 3 6
[46]: 4 2 8 6 1 3 5 7 [47]: 5 7 1 3 8 6 4 2 [48]: 5 7 1 4 2 8 6 3
[49]: 5 7 2 4 8 1 3 6 [50]: 5 7 2 6 3 1 4 8 [51]: 5 7 2 6 3 1 8 4
[52]: 5 7 4 1 3 8 6 2 [53]: 5 8 4 1 3 6 2 7 [54]: 5 8 4 1 7 2 6 3
[55]: 5 1 4 6 8 2 7 3 [56]: 5 1 8 4 2 7 3 6 [57]: 5 1 8 6 3 7 2 4
[58]: 5 2 4 6 8 3 1 7 [59]: 5 2 4 7 3 8 6 1 [60]: 5 2 6 1 7 4 8 3
[61]: 5 2 8 1 4 7 3 6 [62]: 5 3 8 4 7 1 6 2 [63]: 5 3 1 6 8 2 4 7
[64]: 5 3 1 7 2 8 6 4 [65]: 6 8 2 4 1 7 5 3 [66]: 6 1 5 2 8 3 7 4
[67]: 6 2 7 1 3 5 8 4 [68]: 6 2 7 1 4 8 5 3 [69]: 6 3 5 7 1 4 2 8
[70]: 6 3 5 8 1 4 2 7 [71]: 6 3 7 2 4 8 1 5 [72]: 6 3 7 2 8 5 1 4
[73]: 6 3 7 4 1 8 2 5 [74]: 6 3 1 7 5 8 2 4 [75]: 6 3 1 8 4 2 7 5
[76]: 6 3 1 8 5 2 4 7 [77]: 6 4 7 1 3 5 2 8 [78]: 6 4 7 1 8 2 5 3
[79]: 6 4 1 5 8 2 7 3 [80]: 6 4 2 8 5 7 1 3 [81]: 7 1 3 8 6 4 2 5
[82]: 7 2 4 1 8 5 3 6 [83]: 7 2 6 3 1 4 8 5 [84]: 7 3 8 2 5 1 6 4
[85]: 7 3 1 6 8 5 2 4 [86]: 7 4 2 5 8 1 3 6 [87]: 7 4 2 8 6 1 3 5
[88]: 7 5 3 1 6 8 2 4 [89]: 8 2 4 1 7 5 3 6 [90]: 8 2 5 3 1 7 4 6
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)我們的支持。
上一篇:C語(yǔ)言根據(jù)協(xié)議分割獲取字符串單元的實(shí)現(xiàn)代碼
欄 目:C語(yǔ)言
下一篇:C語(yǔ)言實(shí)現(xiàn)推箱子小游戲
本文標(biāo)題:利用C語(yǔ)言解決八皇后問(wèn)題以及解析
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/641.html
您可能感興趣的文章
- 04-02c語(yǔ)言函數(shù)調(diào)用后清空內(nèi)存 c語(yǔ)言調(diào)用函數(shù)刪除字符
- 04-02c語(yǔ)言的正則匹配函數(shù) c語(yǔ)言正則表達(dá)式函數(shù)庫(kù)
- 04-02func函數(shù)+在C語(yǔ)言 func函數(shù)在c語(yǔ)言中
- 04-02c語(yǔ)言中對(duì)數(shù)函數(shù)的表達(dá)式 c語(yǔ)言中對(duì)數(shù)怎么表達(dá)
- 04-02c語(yǔ)言用函數(shù)寫(xiě)分段 用c語(yǔ)言表示分段函數(shù)
- 04-02c語(yǔ)言編寫(xiě)函數(shù)冒泡排序 c語(yǔ)言冒泡排序法函數(shù)
- 04-02c語(yǔ)言沒(méi)有round函數(shù) round c語(yǔ)言
- 04-02c語(yǔ)言分段函數(shù)怎么求 用c語(yǔ)言求分段函數(shù)
- 04-02C語(yǔ)言中怎么打出三角函數(shù) c語(yǔ)言中怎么打出三角函數(shù)的值
- 04-02c語(yǔ)言調(diào)用函數(shù)求fibo C語(yǔ)言調(diào)用函數(shù)求階乘


閱讀排行
- 1C語(yǔ)言 while語(yǔ)句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹(shù)的示例代碼(圣誕
- 3利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問(wèn)題方法
- 4C語(yǔ)言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語(yǔ)言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語(yǔ)言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語(yǔ)言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 04-02c語(yǔ)言函數(shù)調(diào)用后清空內(nèi)存 c語(yǔ)言調(diào)用
- 04-02func函數(shù)+在C語(yǔ)言 func函數(shù)在c語(yǔ)言中
- 04-02c語(yǔ)言的正則匹配函數(shù) c語(yǔ)言正則表達(dá)
- 04-02c語(yǔ)言用函數(shù)寫(xiě)分段 用c語(yǔ)言表示分段
- 04-02c語(yǔ)言中對(duì)數(shù)函數(shù)的表達(dá)式 c語(yǔ)言中對(duì)
- 04-02c語(yǔ)言編寫(xiě)函數(shù)冒泡排序 c語(yǔ)言冒泡排
- 04-02c語(yǔ)言沒(méi)有round函數(shù) round c語(yǔ)言
- 04-02c語(yǔ)言分段函數(shù)怎么求 用c語(yǔ)言求分段
- 04-02C語(yǔ)言中怎么打出三角函數(shù) c語(yǔ)言中怎
- 04-02c語(yǔ)言調(diào)用函數(shù)求fibo C語(yǔ)言調(diào)用函數(shù)求
隨機(jī)閱讀
- 01-11Mac OSX 打開(kāi)原生自帶讀寫(xiě)NTFS功能(圖文
- 04-02jquery與jsp,用jquery
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 01-10delphi制作wav文件的方法
- 01-10使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子
- 01-10SublimeText編譯C開(kāi)發(fā)環(huán)境設(shè)置
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載
- 01-10C#中split用法實(shí)例總結(jié)