深度優先搜索算法(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'表示起點)