voiddfs(int step){判斷邊界嘗試每一種可能for(int i=1;i<=n;i++){繼續下一步dfs(step+1);}return;}#include<stdio.h>int a[10],book[10],n;//C語言的全局變量在沒有賦值前默認為0,所以數組不用賦值了voiddfs(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;}intmain(int argc,charconst*argv[]){printf("Input a int num between 0-9:\r\n");scanf("%d",&n);dfs(1);//首先站到第一個盒子面前return0;}
#include<stdio.h>int m,n,q,p,min=999999;int a[51][51],book[51][51];voiddfs(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;}intmain(int argc,charconst*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);return0;}