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

首頁 > 編程 > C > 正文

算法詳解之回溯法具體實現

2020-01-26 15:36:50
字體:
來源:轉載
供稿:網友

理論輔助:

回溯算法也叫試探法,它是一種系統地搜索問題的解的方法?;厮菟惴ǖ幕舅枷胧牵簭囊粭l路往前走,能進則進,不能進則退回來,換一條路再試。用回溯算法解決問題的一般步驟為:

1、定義一個解空間,它包含問題的解。

2、利用適于搜索的方法組織解空間。

3、利用深度優先法搜索解空間。

4、利用限界函數避免移動到不可能產生解的子空間。

問題的解空間通常是在搜索問題的解的過程中動態產生的,這是回溯算法的一個重要特性。

還是那個基調,不喜歡純理論的東西,喜歡使用例子來講訴理論,在算法系列總結:動態規劃(解公司外包成本問題) 的那一節里面 我們舉得是經典的0-1背包問題,在回溯算法里面也有一些很經典的問題,當然,動態規劃的0-1背包問題其實也可以使用回溯算法來解。在諸如此類似的求最優解的問題中,大部分其實都可以用回溯法來解決,可以認為回溯算法一個”通用解題法“,這是由他試探性的行為決定的,就好比求一個最優解,我可能沒有很好的概念知道怎么做會更快的求出這個最優解,但是我可以嘗試所有的方法,先試探性的嘗試每一個組合,看看到底通不通,如果不通,則折回去,由最近的一個節點繼續向前嘗試其他的組合,如此反復。這樣所有解都出來了,在做一下比較,能求不出最優解嗎?

例子先行,現在我們來看看經典的N后問題

問題描述:在n*n格的棋盤上放置彼此不受攻擊的n個皇后。按照國際象棋的規矩,皇后可以攻擊與之處在同一行或同一列或同一斜線上的棋子。n后問題等價于在n*n格的棋盤上方置n個皇后,任何2個皇后不放在同一行或同一列或同一斜線上。我們需要求的是可放置的總數。
 

基本思路:   用n元組x[1;n]表示n后問題的解。其中,x[i]表示皇后i放置在棋盤的第i行的第x[i]列。由于不容許將2個皇后放在同一列上,所以解向量中的x[i]互不相同。2個皇后不能放在同一斜線上是問題的隱約束。對于一般的n后問題,這一隱約束條件可以化成顯約束的形式。如果將n*n 格的棋盤看做二維方陣,其行號從上到下,列號從左到右依次編號為1,2,...n。從棋盤左上角到右下角的主對角線及其平行線(即斜率為-1的各斜線)上,2個下標值的差(行號-列號)值相等。同理,斜率為+1的每條斜線上,2個下標值的和(行號+列號)值相等。因此,若2個皇后放置的位置分別是(i,j)和(k,l),且 i-j = k -l 或 i+j = k+l,則說明這2個皇后處于同一斜線上。以上2個方程分別等價于i-k = j-l 和 i-k =l-j。由此可知,只要|i-k|=|l-j|成立,就表明2個皇后位于同一條斜線上。

1、從空棋盤起,逐行放置棋子。
2、每在一個布局中放下一個棋子,即推演到一個新的布局。
3、如果當前行上沒有可合法放置棋子的位置,則回溯到上一行,重新布放上一行的棋子。
代碼:

復制代碼 代碼如下:

#include <stdio.h> 
#include <math.h> 
#include<stdlib.h> 
static int n,x[1000]; 
static    long sum; 
int Place(int k) 

for(int j=1;j <k; j++) 
    if((abs(k-j) == abs(x[j]-x[k]))||(x[j]==x[k])) return 0; 
     return 1; 
  }


void Backtrak(int t) 

   if(t>n) sum++; 
   else 
       for(int i=1; i <= n; i++) 
       { 
            x[t] =i; 
            if(Place(t))Backtrak(t+1); 
       } 
}


int main() 

    int nn; 
    while(scanf("%d",&nn)!=EOF) 
    { 
    n=nn; 
    sum=0; 
    for(int i=0;i<=n;i++) 
    x[i]=0; 
    Backtrak(1); 
    printf("%d/n",sum); 

}

這段代碼有必要解釋一下,Place(int)即嘗試看是否可以,如果不可以則回退到t+1層,再嘗試其他的組合。

這里也道出了回溯算法的核心思想:但當探索到某一步時,發現原先選擇并不優或達不到目標,就退回一步重新選擇

算法實踐:

問題描述:在一個n*n的網格里,每個網格可能為“墻壁”(用‘X'表示)和“街道”(用‘.'表示)?,F在在街道放置碉堡,每個碉堡可以向上下左右四個方向開火,子彈射程無限遠。墻壁可以阻擋子彈。問最多能放置多少個碉堡,使它們彼此不會互相摧毀。

如下面四張圖,墻壁用黑正方形表示,街道用空白正方形表示,圓球就代表碉堡。1,2,3是正確的,4,5是錯誤的。以為4,5里面在某一行或者某一列有兩個碉堡,這樣他們就會互相攻擊了。意思明白了嗎?可能我的表達很不清晰,呵呵….

輸入輸出示例


Sample input:
      ――――――輸入的n值 
.X.. 
.... 

XX..
.... 

XX 
.X 
.X. 
X.X 
.X. 
.... 
.... 
.... 
....

Sample output:


初拿到這個問題,你會不會想到回溯算法呢?有人說遍歷墻的位置,然后再墻的上下左右四個格子放置碉堡會得到最優解,這個我沒有驗證過,細細的用筆畫了畫,好像是這么回事,但是很多時候要知道最優解用什么方法是很難發現的,利用通用解題方法回溯法,我們可以在一片茫然的時候開始我們的編程

首先我們來分析一下這個問題:使用回溯法,我們嘗試每一種可能放置的情況,然后進行判斷是否滿足要求,若不滿足,嘗試放到下一個單元格,如此反復,最終,我們將所有可能放置的情況全部遍歷出來了,連所有情況都出來了,難不成還找不到最優解嗎?哈哈。。說做就做…

復制代碼 代碼如下:

#include <stdio.h>
     char map[4][4];
     int best,n;
     int canput(int row, int col)
     {
        int i;
        for (i = row - 1; i >= 0; i--)
        {
          if (map[i][col] == 'o') return 0;
          if (map[i][col] == 'x') break;
        }
        for (i = col - 1; i >= 0; i--)
        {
          if (map[row][i] == 'o') return 0;
          if (map[row][i] == 'x') break;
        }
        return 1;
     }

     void solve(int k,int tot)
     {
        int x,y;
        if(k==n*n)
        {
          if(tot>best)
          {
           best=tot;   return;
          }
        }
        else
        {
          x=k/n;
          y=k%n;
          if((map[x][y]=='.') && (canput(x,y) ) )
          {
            map[x][y]='o';
            solve(k+1,tot+1);
            map[x][y]='.';
          }
         solve(k+1,tot);
         }
      }

     int main()
     {
        int i,j;
        scanf("%d",&n);
        while(n>0)
        {
          for(i=0;i< n;i++)
             for(j=0;j< n;j++)
                 scanf("%1s",&map[i][j]);
          best=0;
          solve(0,0);
          printf("%d/n",best);
          n=0;                            
          scanf("%d",&n);
        }
        return 0;
 }

對上面的代碼做一下點解釋,canput是做檢驗的,檢驗放在某個地點到底行不行得通,solve才是真正進行遞歸回溯的函數。。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲大胆人体av| 在线观看免费高清视频97| 国产精品国产福利国产秒拍| 久久av红桃一区二区小说| 亚洲精品一区av在线播放| 国产精品久久久久秋霞鲁丝| 亚洲精品国产精品久久清纯直播| 97久久久久久| 69国产精品成人在线播放| 国产91精品黑色丝袜高跟鞋| 成人性教育视频在线观看| 久久男人的天堂| 成人伊人精品色xxxx视频| 亚洲裸体xxxx| 日韩欧美中文字幕在线播放| 91久久久久久久久久久久久| 亚洲天堂成人在线| 欧美一级片久久久久久久| 成人黄色av网站| 久久亚洲国产精品成人av秋霞| 久久国产精品电影| 欧美日韩福利视频| 激情久久av一区av二区av三区| 久久精品电影一区二区| 日韩av一卡二卡| 55夜色66夜色国产精品视频| 欧美日韩中文字幕| 亚洲色图欧美制服丝袜另类第一页| 国产不卡在线观看| 国产精品久久久久久久久借妻| 国产精品久久久久久久app| 2020欧美日韩在线视频| 欧美日韩美女在线| 2019中文字幕全在线观看| 亚洲一区二区三区在线免费观看| 久久色免费在线视频| 亚洲人成网站在线播| 菠萝蜜影院一区二区免费| 一区二区三区无码高清视频| 色777狠狠综合秋免鲁丝| 日本国产高清不卡| 成人国内精品久久久久一区| 日韩免费观看在线观看| 国产亚洲精品一区二区| 7777kkkk成人观看| 亚洲自拍偷拍在线| 日韩精品免费在线观看| 日本高清不卡的在线| 视频直播国产精品| 4388成人网| 久久久国产一区| 欧美激情精品久久久久久黑人| 亚州精品天堂中文字幕| 米奇精品一区二区三区在线观看| 日韩在线观看av| 欧美人交a欧美精品| 欧美一级电影在线| 久久综合免费视频| 亚洲国产高潮在线观看| 日韩av在线影院| 81精品国产乱码久久久久久| 亚洲第一精品夜夜躁人人爽| 97视频在线观看视频免费视频| 日韩在线观看电影| 欧美成人免费va影院高清| 91精品久久久久久久久久久久久| 国产成人jvid在线播放| 92裸体在线视频网站| 午夜精品一区二区三区视频免费看| 另类色图亚洲色图| 日本欧美爱爱爱| 夜夜嗨av色一区二区不卡| 亚洲天堂男人天堂女人天堂| 久久久久久国产免费| 少妇高潮 亚洲精品| 国自产精品手机在线观看视频| 国产一区二区三区日韩欧美| 日韩av影视在线| 国产午夜精品一区二区三区| 欧美在线视频一区二区| 97视频国产在线| 日韩性生活视频| 欧美精品一区二区免费| 国产亚洲aⅴaaaaaa毛片| 欧美福利小视频| 午夜精品一区二区三区在线播放| 欧美夫妻性生活xx| 国产又爽又黄的激情精品视频| 亚洲综合色激情五月| 91久久国产精品91久久性色| 亚洲一区二区三区777| 美女视频黄免费的亚洲男人天堂| 在线观看精品国产视频| 亚洲欧美日韩精品久久亚洲区| 精品一区二区三区三区| 精品中文字幕在线2019| 欧美日韩成人在线播放| 亚洲精品在线观看www| 日韩中文字幕在线播放| 欧美激情一区二区三区在线视频观看| 国产一区二区三区视频| 97婷婷大伊香蕉精品视频| 中文字幕一精品亚洲无线一区| 91在线精品播放| 国产精品免费小视频| 欧美最猛性xxxxx亚洲精品| 久久久久久美女| 欧美国产欧美亚洲国产日韩mv天天看完整| 欧美日韩亚洲天堂| 久久久国产精品免费| 美女999久久久精品视频| 国产精品视频资源| 亚洲www在线观看| 91天堂在线观看| 国产日韩欧美在线| 久久久久久美女| 日韩理论片久久| 91免费在线视频网站| 国产精品久久久久久久久久尿| 6080yy精品一区二区三区| 97国产真实伦对白精彩视频8| 欧美亚洲另类视频| 亚洲热线99精品视频| 国产精品美女999| 精品美女永久免费视频| 日韩中文字幕国产精品| 亚洲国产欧美一区二区三区久久| 亚洲天堂免费观看| 97国产精品人人爽人人做| 久久99热这里只有精品国产| 国产激情久久久久| 国产精品视频免费在线观看| 日韩一二三在线视频播| 日韩一区在线视频| 青青精品视频播放| 亚洲天堂日韩电影| 九九精品视频在线观看| 亚洲天堂av在线播放| 亚洲性生活视频在线观看| 亚洲午夜精品久久久久久性色| 狠狠做深爱婷婷久久综合一区| 国产免费亚洲高清| 国产精品一区二区三区免费视频| 久久久人成影片一区二区三区观看| 久久久精品国产一区二区| 国产精品白嫩初高中害羞小美女| 久久伊人精品一区二区三区| 欧美精品在线网站| 久久99国产综合精品女同| 久久全国免费视频| 国内自拍欧美激情| 久久99视频精品| 日本不卡视频在线播放| 久久99亚洲精品| 日韩中文字幕国产精品| 欧美日韩亚洲天堂| 成人自拍性视频| 欧美香蕉大胸在线视频观看| 亚洲色图17p| 欧美人交a欧美精品| 日韩av在线一区| 色与欲影视天天看综合网| 亚洲欧美日韩天堂| 国产97免费视|