深度優先搜索-linux上淺顯易懂的例子

  上次看啊哈算法中的深度優先搜索,本身用的是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 }

 

 

 

相關文章
相關標籤/搜索