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

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

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

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

本文實例講述了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
久久国产精品影视| 日韩成人网免费视频| 亚洲一级片在线看| 国产一区在线播放| 国产一区欧美二区三区| 亚洲情综合五月天| 精品视频久久久久久| 日韩精品免费在线| 久久久噜噜噜久噜久久| 欧美精品一区二区三区国产精品| 久久久中精品2020中文| 欧美性色19p| 欧美黑人极品猛少妇色xxxxx| 国产精品在线看| 日韩中文字幕免费视频| 欧美性猛交xxxx乱大交3| 亚洲国产天堂网精品网站| 日韩国产高清污视频在线观看| 国产精品国产福利国产秒拍| 一区二区国产精品视频| 国产精品视频一区二区高潮| www国产精品com| 国产视频亚洲精品| 久久久999精品视频| 国产精品入口免费视| 成人午夜在线影院| 美女福利视频一区| 精品无码久久久久久国产| 日韩成人中文字幕| 久久夜精品va视频免费观看| 国产精品678| 91精品国产91久久| 久久精品成人一区二区三区| 亚洲色图综合久久| 久久久人成影片一区二区三区观看| 国产精品福利网站| 91香蕉电影院| 日韩激情视频在线播放| 国产欧美精品一区二区三区-老狼| 精品久久久久久中文字幕一区奶水| 日韩有码在线观看| 欧美一级视频免费在线观看| 97在线视频国产| 亚洲精品不卡在线| 日韩av一卡二卡| 欧美专区福利在线| 日本视频久久久| 国产精品亚洲欧美导航| 亚洲欧美日韩网| 97高清免费视频| 国产成人精品日本亚洲专区61| 欧美日韩中文字幕综合视频| 亚洲欧洲日产国产网站| 91欧美精品成人综合在线观看| 91在线高清免费观看| 日韩欧美国产免费播放| 国产精品久久久久久网站| 精品久久久久久亚洲精品| 欧美国产视频日韩| 日本韩国欧美精品大片卡二| 日韩在线视频免费观看高清中文| 国产一区二区三区在线观看视频| 欧美成aaa人片在线观看蜜臀| 亚洲国产精品va在线看黑人| 中文字幕日韩高清| 久久精品视频中文字幕| 91亚洲国产成人精品性色| 另类色图亚洲色图| 韩国国内大量揄拍精品视频| 中文字幕亚洲欧美在线| 久久91精品国产| 久久久久久有精品国产| 亚洲少妇激情视频| 色婷婷**av毛片一区| 久久影视免费观看| 精品亚洲一区二区三区在线播放| 国产精品视频午夜| 久久精品视频一| 日日噜噜噜夜夜爽亚洲精品| 亚洲视频在线观看网站| 最近的2019中文字幕免费一页| 欧美在线一区二区三区四| 尤物yw午夜国产精品视频| 国产精品久久久久久一区二区| 亚州国产精品久久久| 成人激情免费在线| 日韩中文在线中文网在线观看| 亚洲欧美一区二区三区久久| 欧美激情精品久久久久久| 日韩精品中文字幕在线观看| 国产成人精品最新| 亚洲视频日韩精品| 国模视频一区二区三区| 欧美极品美女视频网站在线观看免费| 国产91成人video| 亚洲日本成人网| 国产精品av在线播放| 国产成人精品久久二区二区| 国产精品爽黄69天堂a| 日韩av在线免费| 91久久久久久久久久久久久| 日韩有码视频在线| 欧美理论在线观看| 国产精品网址在线| 国产精品流白浆视频| 亚洲一区二区三区成人在线视频精品| 国产精品成人av性教育| 伊人精品在线观看| 日本人成精品视频在线| 日韩乱码在线视频| 国产精品视频精品视频| 视频一区视频二区国产精品| 精品国产一区二区三区四区在线观看| 综合欧美国产视频二区| 欧美一级大片在线免费观看| 久久免费国产视频| 日韩欧美成人免费视频| 91久久久久久久久久久久久| 日韩欧美国产骚| 26uuu国产精品视频| 欧美亚洲国产日韩2020| 欧美激情免费视频| 日韩av在线影视| 中文字幕久精品免费视频| 国产精品久久久久aaaa九色| 欧美日韩在线免费| 91av在线影院| 欧美激情日韩图片| 日韩国产中文字幕| 久久精品91久久久久久再现| 国产69精品久久久久9999| 欧美一级视频免费在线观看| 草民午夜欧美限制a级福利片| 国产成人久久久精品一区| 综合网中文字幕| 奇米四色中文综合久久| 日韩av不卡在线| 日韩电影免费观看中文字幕| 9.1国产丝袜在线观看| 91在线观看免费| 欧美国产在线电影| 98精品国产高清在线xxxx天堂| 色偷偷88888欧美精品久久久| 欧美伊久线香蕉线新在线| 57pao成人国产永久免费| 国产免费一区二区三区香蕉精| 国产精品最新在线观看| 91精品免费看| 欧美亚洲成人网| 欧美日韩亚洲天堂| 91亚洲精品久久久久久久久久久久| 亚洲综合国产精品| 欧美黑人一区二区三区| 黑人精品xxx一区一二区| 97视频在线播放| www.久久撸.com| 久久精品国产2020观看福利| 久久久在线免费观看| 国自产精品手机在线观看视频| 中文在线资源观看视频网站免费不卡| 美女999久久久精品视频| 国产日韩欧美91| 亚洲日本中文字幕| 激情久久av一区av二区av三区|