日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

啊哈,算法自学记——6th

發布時間:2024/3/24 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 啊哈,算法自学记——6th 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

深度優先搜索

全排列問題:
理解深度優先搜索的關鍵在于:
解決當下該如何做,至于下一步該如何做則與當下該如何做是一樣的的操作。
深度優先搜索基本模型

void dfs(int step) {判斷邊界嘗試每一種可能for(int i=1;i<=n;i++){繼續下一步dfs(step+1);}return; } #include <stdio.h>int a[10],book[10],n;//C語言的全局變量在沒有賦值前默認為0,所以數組不用賦值了void dfs(int step)//step表示站在第幾個盒子面前 {int i;if(step==(n+1))//表示前面n 個盒子已經安排好了{//輸出一種排列,(1-n盒子中的撲克牌編號)for (int i = 1; i <= n; i++){printf("-%d",a[i]); }printf("\r\n");return;//返回之前一步,也即最近調用dfs函數的地方}//此時站在第step個盒子面前,應該放那張牌呢?//按照 1-2-3-4-----n的順序一一嘗試for (int i = 1; i <= n; i++){if(book[i]==0)//如果撲克i還在手上{//開始 常識使用撲克ia[step]=i;//將撲克i放入第step個盒子中book[i]=1;//表示撲克i已經不在手中//第step個盒子已經放好撲克牌,接下來需要走到下一個盒子面前dfs(step+1);//通過函數的遞歸調用來實現book[i]=0;//將剛才常識的撲克牌收回,才能進行下一次的常識}}return; }int main(int argc, char const *argv[]) {printf("Input a int num between 0-9:\r\n");scanf("%d",&n);dfs(1);//首先站到第一個盒子面前return 0; }

運行結果:

用深度優先搜索解決:口口口+口口口=口口口的問題
(填入1~9,每個只能用一次,使等式成立)

#include <stdio.h>/*解決abc+efg=hij的問題 *數字為1~9 */int n,a[10],book[10];//全局變量默認值為0void dfs(int step) {int i;if(step==10)//n 個數,此時說明前面的n 個數已經安排好了{if (((a[1]*100+a[2]*10+a[3])+(a[4]*100+a[5]*10+a[6]))==(a[7]*100+a[8]*10+a[9])){printf("%d%d%d+%d%d%d=%d%d%d\r\n",a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9]);//打印已經安排好的排列n++;}return;}for(int i=1;i<=9;i++){if (book[i]==0)//說明牌還在手上 {a[step]=i;book[i]=1;dfs(step+1);book[i]=0;}}return; }int main(int argc, char const *argv[]) {dfs(1);printf("Total:%d\r\n",n/2);return 0; }

運行結果:

深度優先搜索,迷宮尋找小哈:


最開始在(1,1)只能向右走或者向下走,一個小哼只能向下走或者向右走,我們這里一個一個試,先讓小哼向右走,走不通的時候在想下走,這里我們規定走的方向為: 右、下、左、上

用深度優先搜索來解決:
dfs()函數解決的功能是,當前應該怎么辦,而當小哼在某個點的時候應該處理的是:先判斷是否已經到達小哈的位置,如果沒有到達則找到下一步的位置。

#include <stdio.h>int m,n,q,p,min=999999;int a[51][51],book[51][51];void dfs(int x,int y,int step) {int next[4][2]={//這里的x和y代表的是行和列,{0,1},//向右走**也即行不變,列+1{1,0},//向下走**列不變,行+1{0,-1},//向左走**行不變,列-1{-1,0}//向上走**行-1,列不變};int tx,ty,k;//判斷是否到達小哈的位置if(x==p && y==q){if(step<min)min=step;return;}//枚舉四種走法,方向為右、下、左、上for (k = 0; k <= 3; k++){//計算下一個點的坐標/*當k=0時,tx=x+0;ty=y+1;*當k=1時,tx=x+1;ty=y+0;*當k=2時,tx=x+0;ty=y-1;*當k=3時,tx=x-1;ty=y+0;*/tx=x+next[k][0];ty=y+next[k][1];//判斷是否越界if (tx<1||ty<1||tx>n||ty>m) {continue;//下面的代碼不執行,重新回歸繼續for循環}//判斷該點是否為障礙物或者已經在路徑之中if (a[tx][ty]==0 && book[tx][ty]==0)//如果該點,也就是計算出來的下一個點,既不是障礙物又不在已走過的路徑中{book[tx][ty]=1;//標記該點已經走過dfs(tx,ty,step+1);//開始嘗試下一個點,嘗試每一種可能book[tx][ty]=0;//嘗試結束, 取消這個點的標記} }return; }int main(int argc, char const *argv[]) {int i,j,startx,starty;//讀入迷宮的行和列,n為行,m為列printf("Input the map size:\r\n");scanf("%d %d",&n,&m);//讀取迷宮for(i=1;i<=n;i++){for(j=1;j<=m;j++){scanf("%d",&a[i][j]);//二維數組a用來保存地圖}}//讀入迷宮的起點和終點printf("Input the start and the ending:\r\n");scanf("%d %d %d %d",&startx,&starty,&p,&q);//從起點開始搜索 book[startx][starty]=1;//標記起點已經在路徑中,防止重復走----二維數組book用來存儲已經走過的點dfs(startx,starty,0);//從起點開始,走過的路程為0printf("The min length is: %d\r\n",min);return 0; }

運行結果:

總結

以上是生活随笔為你收集整理的啊哈,算法自学记——6th的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。