上次看啊哈算法中的深度優先搜索,本身用的是linux(linux粉,windows黑,嘿嘿),字符界面,爲了強化對這個的理解,就在linux上對這個例子的代碼作了一點修改能夠很清楚的看到整個搜索過程,至關於動態的展現吧,雖然不是動畫,原本想用QT來寫的,不過實在是沒時間(實際上是QT過久沒用了.....)linux
深度優先搜索說到底就是一條道走到黑直到達到目的,而後再往回走,看看上次選擇的地方是否還有別的路能夠選擇走。代碼中定義了宏MAX_NUM=8,算法
就是8x8的迷宮,windows
用戶輸入開始點和結束點,找到開始點到結束點的最短路徑。LOOK:dom
其中工表明能夠走的路,山是隨機出現的20個障礙。動畫
當指定了起始點後(沒作校驗,不能落在障礙點上),會將整個搜索過程在界面上打印出來,每秒顯示一步:spa
固然也可能以爲不停的打印會太繁瑣,那就將dfs中的調用dfs_print和sleep註釋掉便可。code
再看看最終的結果:blog
這個只是其中一條最短路徑,而爲了減小運算量,我將當前的路徑長度和已經找到的路徑長度作對比,大於等於時就不往下找了。input
由於當迷宮是40*40,沒有加這個,個人虛擬機運行了1分鐘都沒有出來結果(固然是將打印去掉的狀況下)。源碼
源碼:
1 #include<stdio.h> 2 #include<string.h> 3 #include<stdlib.h> 4 #define MAX_NUM 8 5 6 void dfs_print(); 7 8 int maze[MAX_NUM][MAX_NUM]; 9 int book[MAX_NUM][MAX_NUM]; 10 int map[MAX_NUM][MAX_NUM]; 11 int min=10000; 12 int px,py; 13 int startx, starty; 14 15 int next[4][2] = { 16 {0,1}, 17 {1,0}, 18 {0,-1}, 19 {-1,0}}; 20 21 void dfs(int x, int y, int step) 22 { 23 int i; 24 int tx,ty; 25 26 /* 27 printf("\n"); 28 dfs_print(); 29 sleep(1); 30 */ 31 32 if(step >= min) 33 return; 34 if(x==px && y==py) 35 { 36 printf("SUCCESS! 本次路徑長度=%d", step); 37 if(step < min) 38 { 39 printf("本路徑是當前最短的路徑"); 40 memcpy(map, book, sizeof(book)); 41 min= step; 42 } 43 printf("\n"); 44 return; 45 } 46 47 48 for(i=0;i<=3;i++) 49 { 50 tx = x+next[i][0]; 51 ty = y+next[i][1]; 52 if(tx <0 || tx >=MAX_NUM || ty <0 || ty >= MAX_NUM) 53 continue; 54 55 if(book[tx][ty] == 0 && maze[tx][ty] == 0) 56 { 57 book[tx][ty] = 1; 58 dfs(tx,ty,step+1); 59 book[tx][ty] = 0; 60 } 61 } 62 return; 63 } 64 65 void dfs_print() 66 { 67 int i,j; 68 printf("\033[2J"); 69 for(i=0;i<MAX_NUM;i++) 70 { 71 for(j=0; j<MAX_NUM; j++) 72 { 73 if(i==startx && j==starty) 74 printf("\033[40;31m頭\033[0m"); 75 else if(px==i && py==j) 76 printf("\033[40;31m尾\033[0m"); 77 else if(maze[i][j]== 0 && book[i][j]==0) 78 printf("工"); 79 else if(maze[i][j]== 0 && book[i][j]==1) 80 printf("\033[40;31m->\033[0m"); 81 else if(maze[i][j] == 1) 82 printf("\033[40;32m山\033[0m"); 83 } 84 printf("\n"); 85 } 86 } 87 88 89 void main() 90 { 91 int i,j; 92 int x; 93 int y; 94 95 memset(maze, 0, sizeof(maze)); 96 for(i=0;i<MAX_NUM*2;i++) 97 { 98 x = random()%MAX_NUM; 99 y = random()%MAX_NUM; 100 maze[x][y] = 1; 101 } 102 103 for(i=0; i<MAX_NUM; i++) 104 { 105 for(j=0; j<MAX_NUM; j++) 106 { 107 if(maze[i][j] == 0) 108 printf("工"); 109 else 110 printf("山"); 111 } 112 printf("\n"); 113 } 114 115 printf("please input start-end point:"); 116 scanf("%d %d %d %d", &startx, &starty, &px, &py); 117 dfs_print(); 118 book[startx][starty] = 1; 119 dfs(startx, starty, 0); 120 printf("MIN=%d\n", min); 121 for(i=0;i<MAX_NUM;i++) 122 { 123 for(j=0; j<MAX_NUM; j++) 124 { 125 if(i==startx && j==starty) 126 printf("\033[40;31m頭\033[0m"); 127 else if(px==i && py==j) 128 printf("\033[40;31m尾\033[0m"); 129 else if(maze[i][j]== 0 && map[i][j]==0) 130 printf("工"); 131 else if(maze[i][j]== 0 && map[i][j]==1) 132 printf("\033[40;31m->\033[0m"); 133 else if(maze[i][j] == 1) 134 printf("\033[40;32m山\033[0m"); 135 } 136 printf("\n"); 137 } 138 }