深度優先算法——走迷宮的實現


深度優先搜索算法(Depth-First-Search),是搜索算法的一種。是沿着樹的深度遍歷樹的節點,盡可能深的搜索樹的分支。當節點v的所有邊都己被探尋過,搜索將回溯到發現節點v的那條邊的起始節點。這一過程一直進行到已發現從源節點可達的所有節點為止。如果還存在未被發現的節點,則選擇其中一個作為源節點並重復以上過程,整個進程反復進行直到所有節點都被訪問為止。屬於盲目搜索

深度優先搜索是圖論中的經典算法,利用深度優先搜索算法可以產生目標圖的相應拓撲排序表,利用拓撲排序表可以方便的解決很多相關的圖論問題,如最大路徑問題等等。
因發明“深度優先搜索算法”,霍普克洛夫特與陶爾揚共同獲得計算機領域的最高獎:圖靈獎.
 
學以致用,為了在實踐中學習,我用深度優先算法寫了一個走迷宮的小程序。
 
具體內容為:
1、輸入長寬和迷宮地圖(‘#’代表牆,‘.'代表空地)
2、輸入起點和終點坐標
3、用深度優先算法查找起點到終點的最短路徑並顯示出來
 
下面是具體C語言實現:
 
  1 #include <stdio.h>
  2 
  3 char map[50][51];    //地圖上限50*50 
  4 int sign[50][50];     //標記 
  5 int next[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
  6 int n,m;    //實際地圖行數、列數 
  7 int endy,endx;     //終點位置 
  8 int min=99999999;
  9 
 10 /* run this program using the console pauser or add your own getch, system("pause") or input loop */
 11 
 12 //構造一個盞來記錄走迷宮的路徑
 13 struct Node
 14 {
 15     int y;
 16     int x;
 17 };
 18 
 19 struct Stack
 20 {
 21     Node * pbase;
 22     int top;
 23 };
 24 
 25 void StackInit(Stack * pstack){
 26     pstack->pbase=new Node[100];
 27     pstack->top=0;
 28 }
 29 
 30 void StackPush(Stack * pstack,int y,int x){
 31     Node node;
 32     node.y=y;
 33     node.x=x;
 34     pstack->pbase[pstack->top]=node;
 35     ++pstack->top;
 36 }
 37 
 38 void StackCopy(Stack * pstack1,Stack * pstack2){
 39     pstack2->top=pstack1->top;
 40     for(int i=0;i<pstack2->top;i++)
 41     {
 42         pstack2->pbase[i]=pstack1->pbase[i];
 43     }
 44 }
 45 
 46 void StackPop(Stack * pstack){
 47     --pstack->top;
 48 } 
 49 
 50 Stack stack;
 51 Stack minstack;
 52 
 53 //深度優先搜索 
 54 void dfs(int y,int x,int step){
 55     int ty,tx;
 56     if(y==endy&&x==endx)
 57     {
 58         if(step<min)
 59         {
 60             StackCopy(&stack,&minstack);
 61             min=step;
 62         }
 63         return;
 64     }
 65     
 66     for(int i=0;i<4;i++)
 67     {
 68         ty=y+next[i][0];
 69         tx=x+next[i][1];
 70         if(ty>=0&&ty<n&&tx>=0&&tx<m&&map[ty][tx]!='#'&&sign[ty][tx]==0)
 71         {
 72             StackPush(&stack,ty,tx);
 73             sign[ty][tx]=1;
 74             dfs(ty,tx,step+1);
 75             StackPop(&stack);
 76             sign[ty][tx]=0;
 77         }
 78     }
 79     return;
 80 }
 81 
 82 int main(int argc, char** argv) {
 83     printf("請輸入行數和列數:");
 84     scanf("%d%d",&n,&m);
 85     printf("請創建地圖:\n");
 86     for(int i=0;i<n;i++)
 87     {
 88         scanf("%s",&map[i]);
 89     }
 90     printf("創建的地圖如下:\n");
 91     for(int i=0;i<n;i++)
 92     {
 93         printf("%s\n",map[i]); 
 94     }
 95     printf("請輸入起點(y,x):");
 96     int starty,startx;
 97     scanf("%d%d",&starty,&startx);
 98     printf("請輸入終點(y,x):");
 99     scanf("%d%d",&endy,&endx);
100     sign[starty][startx]=1;
101     
102     StackInit(&stack);
103     StackInit(&minstack);
104 
105     dfs(starty,startx,0); 
106     printf("最短路程為%d\n",min);
107     
108     printf("最短路徑為:\n");
109     map[starty][startx]='s';    //用字符's'表示起點 
110     for(int i=0;i<minstack.top;i++)
111     {
112         map[minstack.pbase[i].y][minstack.pbase[i].x]='>';
113     }
114     for(int i=0;i<n;i++)
115     {
116         printf("%s\n",map[i]); 
117     }    
118     return 0;
119 }

 

運行結果如圖(’>'表示最短路徑,'s'表示起點)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM