亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

C++基于回溯法解決八皇后問題示例

2020-05-23 13:39:52
字體:
來源:轉載
供稿:網友

本文實例講述了C++基于回溯法解決八皇后問題的方法。分享給大家供大家參考,具體如下:

回溯法的基本做法是搜索,或是一種組織得井井有條的,能避免不必要搜索的窮舉式搜索法。這種方法適用于解一些組合數相當大的問題。

回溯法在問題的解空間樹中,按深度優先策略,從根結點出發搜索解空間樹。算法搜索至解空間樹的任意一點時,先判斷該結點是否包含問題的解。如果肯定不包含,則跳過對該結點為根的子樹的搜索,逐層向其祖先結點回溯;否則,進入該子樹,繼續按深度優先策略搜索。

回溯法指導思想——走不通,就掉頭。設計過程:確定問題的解空間;確定結點的擴展規則;搜索。

n皇后問題

要在n*n的國際象棋棋盤中放n個皇后,使任意兩個皇后都不能互相吃掉。規則:皇后能吃掉同一行、同一列、同一對角線的任意棋子。求所有的解。n=8是就是著名的八皇后問題了。

設八個皇后為xi,分別在第i行(i=1,2,3,4……,8);

問題的解狀態:可以用(1,x1),(2,x2),……,(8,x8)表示8個皇后的位置;

由于行號固定,可簡單記為:(x1,x2,x3,x4,x5,x6,x7,x8);

問題的解空間:(x1,x2,x3,x4,x5,x6,x7,x8),1≤xi≤8(i=1,2,3,4……,8),共88個狀態;

約束條件:八個(1,x1),(2,x2) ,(3,x3),(4,x4) ,(5,x5), (6,x6) , (7,x7), (8,x8)不在同一行、同一列和同一對角線上。

盲目的枚舉算法:通過8重循環模擬搜索空間中的88個狀態,從中找出滿足約束條件的“答案狀態”。程序如下:

/* *作者:侯凱 *說明:八皇后——盲目迭代法 *日期:2013-12-18 */#include <iostream>using namespace std;bool check_1(int a[],int n){for(int i=2;i<=n;i++){ for(int j=1;j<=i-1;j++) {  if ((a[i]==a[j])||(abs(a[i]-a[j])==i-j))  {   return false;  } }}return true;//不沖突}void queens_1(){ int a[9]; int count = 0; for(a[1]=1;a[1]<=8;a[1]++) {  for(a[2]=1;a[2]<=8;a[2]++)  {   for(a[3]=1;a[3]<=8;a[3]++)   {    for(a[4]=1;a[4]<=8;a[4]++)    {     for(a[5]=1;a[5]<=8;a[5]++)     {      for(a[6]=1;a[6]<=8;a[6]++)      {       for(a[7]=1;a[7]<=8;a[7]++)       {        for(a[8]=1;a[8]<=8;a[8]++)        {         if(!check_1(a,8))           continue;         else         {          for(int i=1;i<=8;i++)           {           cout<<a[i];          }          cout<<endl;          count++;         }        }       }      }     }    }   }  } } cout<<count<<endl;}void main(){ queens_1();}

程序思想比較簡單,最后可知共92種擺放方法。如果能夠排除那些沒有前途的狀態,會節約時間——回溯法(走不通,就回頭)。

bool check_2 (int a[ ],int n){//多次被調用,只需一重循環  for(int i=1;i<=n-1;i++) {  if((abs(a[i]-a[n])==n-i)||(a[i]==a[n]))   return false; }   return true;}void queens_2(){ int a[9]; int count = 0; for(a[1]=1;a[1]<=8;a[1]++) {  for(a[2]=1;a[2]<=8;a[2]++)  {   if (!check_2(a,2)) continue;   for(a[3]=1;a[3]<=8;a[3]++)   {    if (!check_2(a,3)) continue;    for(a[4]=1;a[4]<=8;a[4]++)    {     if (!check_2(a,4)) continue;     for(a[5]=1;a[5]<=8;a[5]++)     {      if (!check_2(a,5)) continue;      for(a[6]=1;a[6]<=8;a[6]++)      {       if (!check_2(a,6)) continue;       for(a[7]=1;a[7]<=8;a[7]++)       {        if (!check_2(a,7)) continue;        for(a[8]=1;a[8]<=8;a[8]++)        {         if (!check_2(a,8))           continue;         else         {          for(int i=1;i<=8;i++)           {           cout<<a[i];          }          cout<<endl;          count++;         }        }       }      }     }    }   }  } } cout<<count<<endl;}void main(){ queens_2();}

n此算法可讀性很好,體現了“回溯”。但它只針對八皇后問題,解決任意的n皇后問題還要修改程序結構。如果要解決n皇后的問題,就需要將n作為參數傳遞給函數,函數需要重寫來實現回溯(不能采用級聯的for循環,n不確定);從另一方面,程序中出現了大量的for循環,而且for中的函數結構很相似,自然想到的是遞歸迭代回溯。這就是回溯比較常用的兩種實現方法:非遞歸回溯和遞歸回溯。

非遞歸回溯的程序實現:

void backdate (int n){  int count = 0; int a[100]; int k = 1; a[1]=0;  while(k>0) {  a[k]=a[k]+1;//對應for循環的1~n  while((a[k]<=n)&&(!check_2(a,k)))//搜索第k個皇后位置  {   a[k]=a[k]+1;  }  if(a[k]<=n)//找到了合理的位置  {   if(k==n )   {//找到一組解    for(int i=1;i<=8;i++)     {     cout<<a[i];    }    cout<<endl;    count++;   }    else    {    k=k+1;//繼續為第k+1個皇后找到位置,對應下一級for循環     a[k]=0;//下一個皇后一定要從頭開始搜索   }  }  else  {   k=k-1;//回溯,對應執行外內層for循環回到更上層   } } cout<<count<<endl;}void main(){ backdate(8);}

這樣也可以得到,8皇后問題的92中結果。更簡單、可讀的方法是采用遞歸的方式,如下:

int a[100], n, count;void backtrack(int k){ if (k>n)//找到解 {  for(int i=1;i<=8;i++)   {   cout<<a[i];  }  cout<<endl;  count++; } else {  for (int i = 1;i <=n; i++)  {   a[k] = i;   if (check_2(a,k) == 1)   {backtrack(k+1);}  } }}void main(){ n=8,count=0; backtrack(1); cout<<count<<endl;}

可見,遞歸調用大大減少了代碼量,也增加了程序的可讀性。給出其中的一個解,如下:

C++,回溯法,八皇后問題

希望本文所述對大家C++程序設計有所幫助。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美激情a在线| 国产精品成人一区二区三区吃奶| 午夜精品久久久久久久99热浪潮| 国产91精品青草社区| yellow中文字幕久久| 国产精品影片在线观看| 日韩亚洲国产中文字幕| 91在线观看免费网站| 欧美日韩在线视频观看| 欧美日韩精品国产| 4444欧美成人kkkk| 国产成人在线一区二区| 国产综合视频在线观看| 国a精品视频大全| 欧美精品亚州精品| 精品欧美激情精品一区| 中文字幕综合一区| 成人网欧美在线视频| 亚洲女人天堂成人av在线| 国产精品成人品| 亚洲电影免费观看高清| 乱亲女秽乱长久久久| 欧美成人h版在线观看| 亚洲美女性生活视频| 午夜精品视频网站| 久久av红桃一区二区小说| 国产999精品久久久影片官网| 亚洲精品久久久久久久久久久久| 欧美激情视频免费观看| 亚洲最大激情中文字幕| 日韩在线视频观看正片免费网站| 97碰碰碰免费色视频| 91精品国产精品| 久久免费精品日本久久中文字幕| 国产精品露脸自拍| 久久久久久久久久久久av| 国产黑人绿帽在线第一区| 国产精品视频999| 国产精品极品在线| 国产精品久久久久久一区二区| 成人黄色免费网站在线观看| 欧美精品在线视频观看| 亚洲老头同性xxxxx| 九九热这里只有精品免费看| 亚洲国产高潮在线观看| 国产精品十八以下禁看| 欧美精品福利视频| 日韩欧美国产高清91| 91久久夜色精品国产网站| 在线视频一区二区| 亚洲va男人天堂| 91国内揄拍国内精品对白| 91国内揄拍国内精品对白| 91日韩在线播放| 日韩中文字幕在线视频播放| 精品成人69xx.xyz| 精品国产一区二区三区在线观看| 亚洲色图校园春色| 亚洲曰本av电影| 久久久精品国产亚洲| 欧美黄色片免费观看| 91成品人片a无限观看| 欧美俄罗斯性视频| 原创国产精品91| 国产精品入口福利| 一本色道久久88综合亚洲精品ⅰ| 懂色av影视一区二区三区| 欧美激情视频三区| 欧美日韩爱爱视频| 久久视频国产精品免费视频在线| 久久中文字幕一区| 中文字幕精品av| 亚洲理论片在线观看| 色与欲影视天天看综合网| 亚洲电影中文字幕| 欧美一级片免费在线| 国产精品爽爽ⅴa在线观看| 97精品在线观看| 国产精品xxxxx| 国产精品女主播视频| 国产一区二区三区免费视频| 精品美女久久久久久免费| 亚洲国产古装精品网站| 日韩精品免费综合视频在线播放| 亚洲精品www| 欧美超级乱淫片喷水| 久久久久亚洲精品成人网小说| 亚洲影院色无极综合| 国产精品爽黄69| 欧美在线视频a| 日韩a**中文字幕| 亚洲美女av黄| 91精品国产99| 一区二区欧美日韩视频| 日本不卡免费高清视频| 国产成人久久久精品一区| 国产视频丨精品|在线观看| 中文字幕亚洲无线码在线一区| 日韩视频欧美视频| 亚洲美女视频网| 日韩av快播网址| 国产99久久久欧美黑人| 国产视频精品va久久久久久| 久久久久久国产精品三级玉女聊斋| 久久久久久有精品国产| 日韩精品免费在线观看| 欧美激情xxxx| 久久久女人电视剧免费播放下载| 18性欧美xxxⅹ性满足| 国产男人精品视频| 国产香蕉一区二区三区在线视频| 国产精品久久久久久久久久| 色综合伊人色综合网| 美日韩丰满少妇在线观看| 久热精品视频在线| 人妖精品videosex性欧美| 日韩欧美国产成人| 国产精品视频男人的天堂| 亚洲女人天堂av| 另类视频在线观看| 国产日韩欧美综合| 日韩电影视频免费| 日韩在线欧美在线国产在线| 不卡av在线播放| 欧美性猛交xxxx偷拍洗澡| 最近中文字幕2019免费| 国产精品美女主播| 国产欧美精品日韩| 久久精品中文字幕免费mv| 亚洲视屏在线播放| 91探花福利精品国产自产在线| 欧美有码在线视频| 欧美黑人巨大精品一区二区| 欧美成aaa人片免费看| 久久亚洲精品毛片| 国产精品自产拍在线观看中文| 黄色一区二区在线| 奇门遁甲1982国语版免费观看高清| 中文字幕亚洲字幕| 国产福利视频一区| www.欧美免费| 精品日本美女福利在线观看| 亚洲第一精品久久忘忧草社区| 91a在线视频| 亚洲高清在线观看| 亚洲人在线观看| 日韩激情第一页| 久久精品福利视频| 2019亚洲日韩新视频| 久久久av网站| 精品欧美aⅴ在线网站| 亚洲成色777777在线观看影院| 成人综合网网址| 在线亚洲国产精品网| 欧美激情在线视频二区| 最近中文字幕mv在线一区二区三区四区| 国产精品白丝av嫩草影院| 日韩三级影视基地| 亚洲女在线观看| 亚洲第一在线视频| 国产成人在线一区| 日韩三级影视基地| 正在播放欧美视频| 亚洲精品视频网上网址在线观看|