最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

利用C語言解決八皇后問題以及解析

 更新時(shí)間:2018年12月07日 08:42:55   投稿:daisy  
這篇文章主要給大家介紹了關(guān)于利用C語言解決八皇后問題以及解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

前言

八皇后問題是一個(gè)古老而著名的問題。該問題是19世紀(jì)著名的數(shù)學(xué)家高斯1850年提出:在一個(gè)8*8國際象棋盤上,有8個(gè)皇后,每個(gè)皇后占一格;要求皇后之間不會(huì)出現(xiàn)相互“攻擊”的現(xiàn)象,即不能有兩個(gè)皇后處在同一行、同一列或同一對(duì)角線上。問共有多少種不同的方法?

回溯算法也叫試探法,它是一種搜索問題的解的方法。冋溯算法的基本思想是在一個(gè)包含所有解的解空間樹中,按照深度優(yōu)先的策略,從根結(jié)點(diǎn)出發(fā)搜索解空間樹。算法搜索至解空間樹的任意結(jié)點(diǎn)時(shí),總是先判斷該結(jié)點(diǎn)是否肯定不包含問題的解。如果肯定不包含,則跳過對(duì)以該結(jié)點(diǎn)為根的子樹的系統(tǒng)搜索,逐層向其祖先結(jié)點(diǎn)回溯。否則,進(jìn)入該子樹,繼續(xù)按深度優(yōu)先的策略進(jìn)行搜索。回溯法在用來求問題的所有解時(shí),要回溯到根,且根結(jié)點(diǎn)的所有子樹都已被搜索遍才結(jié)束。

八皇后問題有很多中解法,其中使用回溯法進(jìn)行求解是其中一種。而回溯發(fā)也是最直接的一種解法,也較容易理解。

八皇后問題的回溯法算法,可以采用一維數(shù)組來進(jìn)行處理。數(shù)組的下標(biāo)i表示棋盤上的第i列,a[i]的值表示皇后在第i列所放的位置。例如,a[1]=5,表示在棋盤的第例的第五行放一個(gè)皇后。程序中首先假定a[1]=1,表示第一個(gè)皇后放在棋盤的第一列的第一行的位置上,然后試探第二列中皇后可能的位置,找到合適的位置后,再處理后續(xù)的各列,這樣通過各列的反復(fù)試探,可以最終找出皇后的全部擺放方法。

八皇后問題可以使用回溯法進(jìn)行求解,程序?qū)崿F(xiàn)如下:

#include<stdio.h>

#define Queens 8 //定義結(jié)果數(shù)組的大小,也就是皇后的數(shù)目

int a[Queens+1];  //八皇后問題的皇后所在的行列位置,從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é)束且還沒處理到第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)過一圈追上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;  //開始尋找下一個(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é)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • C語言 模擬實(shí)現(xiàn)strcpy與strcat函數(shù)詳解

    C語言 模擬實(shí)現(xiàn)strcpy與strcat函數(shù)詳解

    這篇文章主要介紹了怎樣用C語言模擬實(shí)現(xiàn)strcpy與strcat函數(shù),strcpy()函數(shù)是C語言中的一個(gè)復(fù)制字符串的庫函數(shù),strcat()函數(shù)的功能是實(shí)現(xiàn)字符串的拼接
    2022-04-04
  • C++實(shí)現(xiàn)LeetCode(117.每個(gè)節(jié)點(diǎn)的右向指針之二)

    C++實(shí)現(xiàn)LeetCode(117.每個(gè)節(jié)點(diǎn)的右向指針之二)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(117.每個(gè)節(jié)點(diǎn)的右向指針之二),本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C++超詳細(xì)講解智能指針

    C++超詳細(xì)講解智能指針

    為了解決內(nèi)存泄漏的問題,C++中提出了智能指針。內(nèi)存泄漏的產(chǎn)生原因有很多,即使我們正確的使用malloc和free關(guān)鍵字也有可能產(chǎn)生內(nèi)存泄漏,如在malloc和free之間如果存在拋異常,那也會(huì)產(chǎn)生內(nèi)存泄漏。這種問題被稱為異常安全
    2022-06-06
  • C語言鏈表實(shí)現(xiàn)貪吃蛇小游戲

    C語言鏈表實(shí)現(xiàn)貪吃蛇小游戲

    這篇文章主要為大家詳細(xì)介紹了C語言鏈表貪吃蛇小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-05-05
  • C++智能指針之shared_ptr詳解

    C++智能指針之shared_ptr詳解

    這篇文章主要為大家詳細(xì)介紹了C++智能指針之shared_ptr,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • Qt利用QScroller實(shí)現(xiàn)home界面滑動(dòng)效果

    Qt利用QScroller實(shí)現(xiàn)home界面滑動(dòng)效果

    這篇文章主要為大家詳細(xì)介紹了Qt如何利用QScroller實(shí)現(xiàn)home界面滑動(dòng)效果,文中的實(shí)現(xiàn)過程講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2022-11-11
  • C語言對(duì)堆排序一個(gè)算法思路和實(shí)現(xiàn)代碼

    C語言對(duì)堆排序一個(gè)算法思路和實(shí)現(xiàn)代碼

    這篇文章主要介紹了C語言對(duì)堆排序一個(gè)算法思路和實(shí)現(xiàn)代碼,堆排序是一種樹形選擇排序,是對(duì)直接選擇排序的有效改進(jìn),需要的朋友可以參考下
    2014-06-06
  • 詳細(xì)分析C++ 異常處理

    詳細(xì)分析C++ 異常處理

    這篇文章主要介紹了C++ 異常處理的的相關(guān)資料,文中示例代碼非常詳細(xì),幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-06-06
  • snprintf函數(shù)的用法解析

    snprintf函數(shù)的用法解析

    以下是對(duì)snprintf函數(shù)的具體使用方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過來參考下
    2013-07-07
  • C/C++?Qt?TreeWidget?單層樹形組件應(yīng)用小結(jié)

    C/C++?Qt?TreeWidget?單層樹形組件應(yīng)用小結(jié)

    TreeWidget?目錄樹組件,該組件適用于創(chuàng)建和管理目錄樹結(jié)構(gòu),在開發(fā)中我們經(jīng)常會(huì)把它當(dāng)作一個(gè)升級(jí)版的ListView組件使用,本文將通過TreeWidget實(shí)現(xiàn)多字段顯示,并增加一個(gè)自定義菜單,通過在指定記錄上右鍵可彈出該菜單并對(duì)指定記錄進(jìn)行操作
    2021-11-11

最新評(píng)論

文成县| 安远县| 新民市| 曲麻莱县| 富源县| 应城市| 基隆市| 阿克苏市| 宜章县| 满城县| 青神县| 鸡泽县| 黔东| 马鞍山市| 赤水市| 秦安县| 伊川县| 正蓝旗| 教育| 黄梅县| 彭州市| 乌拉特前旗| 太仆寺旗| 博兴县| 定西市| 平度市| 衡阳县| 西乌| 松滋市| 金坛市| 会昌县| 丹棱县| 油尖旺区| 大宁县| 雷州市| 太保市| 呼和浩特市| 疏附县| 乌恰县| 沙雅县| 鹤岗市|