迷宫问题|深度优先搜索&广度优先搜索

什么样的数据结构决定了什么样的方法。


1.用栈实现深度优先搜索(DSF)

[cpp]  view plain copy
  1. #include <stdio.h>  
  2.   
  3. #define MAX_ROW 5  
  4. #define MAX_COL 5  
  5.   
  6. struct point { int row, col; } stack[512];  
  7. int top = 0;  
  8.   
  9. void push(struct point p)  
  10. {  
  11.     stack[top++] = p;  
  12. }  
  13.   
  14. struct point pop(void)  
  15. {  
  16.     return stack[--top];  
  17. }  
  18.   
  19. int is_empty(void)  
  20. {  
  21.     return top == 0;  
  22. }  
  23.   
  24. int maze[MAX_ROW][MAX_COL] = {  
  25.     0, 1, 0, 0, 0,  
  26.     0, 1, 0, 1, 0,  
  27.     0, 0, 0, 0, 0,  
  28.     0, 1, 1, 1, 0,  
  29.     0, 0, 0, 1, 0,  
  30. };  
  31.   
  32. void print_maze(void)  
  33. {  
  34.     int i, j;  
  35.     for (i = 0; i < MAX_ROW; i++) {  
  36.         for (j = 0; j < MAX_COL; j++)  
  37.             printf("%d ", maze[i][j]);  
  38.         putchar('\n');  
  39.     }  
  40.     printf("*********\n");  
  41. }  
  42.   
  43. struct point predecessor[MAX_ROW][MAX_COL] = {  
  44.     {{-1,-1}, {-1,-1}, {-1,-1}, {-1,-1}, {-1,-1}},  
  45.     {{-1,-1}, {-1,-1}, {-1,-1}, {-1,-1}, {-1,-1}},  
  46.     {{-1,-1}, {-1,-1}, {-1,-1}, {-1,-1}, {-1,-1}},  
  47.     {{-1,-1}, {-1,-1}, {-1,-1}, {-1,-1}, {-1,-1}},  
  48.     {{-1,-1}, {-1,-1}, {-1,-1}, {-1,-1}, {-1,-1}},  
  49. };  
  50.   
  51. void visit(int row, int col, struct point pre)  
  52. {  
  53.     struct point visit_point = { row, col };  
  54.     maze[row][col] = 2;  
  55.     predecessor[row][col] = pre;  
  56.     push(visit_point);  
  57. }  
  58.   
  59. int main(void)  
  60. {  
  61.     struct point p = { 0, 0 };  
  62.   
  63.     maze[p.row][p.col] = 2;  
  64.     push(p);      
  65.       
  66.     while (!is_empty()) {  
  67.         p = pop();  
  68.         if (p.row == MAX_ROW - 1  /* goal */  
  69.             && p.col == MAX_COL - 1)  
  70.             break;  
  71.         if (p.col+1 < MAX_COL     /* right */  
  72.             && maze[p.row][p.col+1] == 0)  
  73.             visit(p.row, p.col+1, p);  
  74.         if (p.row+1 < MAX_ROW     /* down */  
  75.             && maze[p.row+1][p.col] == 0)  
  76.             visit(p.row+1, p.col, p);  
  77.         if (p.col-1 >= 0          /* left */  
  78.             && maze[p.row][p.col-1] == 0)  
  79.             visit(p.row, p.col-1, p);  
  80.         if (p.row-1 >= 0          /* up */  
  81.             && maze[p.row-1][p.col] == 0)  
  82.             visit(p.row-1, p.col, p);  
  83.         print_maze();  
  84.     }  
  85.     if (p.row == MAX_ROW - 1 && p.col == MAX_COL - 1) {  
  86.         printf("(%d, %d)\n", p.row, p.col);  
  87.         while (predecessor[p.row][p.col].row != -1) {  
  88.             p = predecessor[p.row][p.col];  
  89.             printf("(%d, %d)\n", p.row, p.col);  
  90.         }  
  91.     } else  
  92.         printf("No path!\n");  
  93.   
  94.     return 0;  
  95. }  


2.用队列实现广度优先搜索

[cpp]  view plain copy
  1. #include <stdio.h>  
  2.   
  3. #define MAX_ROW 5  
  4. #define MAX_COL 5  
  5.   
  6. struct point {  
  7.     int row, col, predecessor;  
  8. } queue[512];  
  9. int head = 0, tail = 0;  
  10.   
  11. void enqueue(struct point p) {  
  12.     queue[tail++] = p;  
  13. }  
  14.   
  15. struct point dequeue(void) {  
  16.     return queue[head++];  
  17. }  
  18.   
  19. int is_empty(void) {  
  20.     return head == tail;  
  21. }  
  22.   
  23. int maze[MAX_ROW][MAX_COL] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0,  
  24.         1, 1, 1, 0, 0, 0, 0, 1, 0, };  
  25.   
  26. void print_maze(void) {  
  27.     int i, j;  
  28.     for (i = 0; i < MAX_ROW; i++) {  
  29.         for (j = 0; j < MAX_COL; j++)  
  30.             printf("%d ", maze[i][j]);  
  31.         putchar('\n');  
  32.     }  
  33.     printf("*********\n");  
  34. }  
  35.   
  36. void visit(int row, int col) {  
  37.     struct point visit_point = { row, col, head - 1 };  
  38.     maze[row][col] = 2;  
  39.     enqueue(visit_point);  
  40. }  
  41.   
  42. int main(void) {  
  43.     struct point p = { 0, 0, -1 };  
  44.   
  45.     maze[p.row][p.col] = 2;  
  46.     enqueue(p);  
  47.   
  48.     while (!is_empty()) {  
  49.         p = dequeue();  
  50.         if (p.row == MAX_ROW - 1 /* goal */  
  51.                 && p.col == MAX_COL - 1)  
  52.             break;  
  53.         if (p.col + 1 < MAX_COL /* right */  
  54.                 && maze[p.row][p.col + 1] == 0)  
  55.             visit(p.row, p.col + 1);  
  56.         if (p.row + 1 < MAX_ROW /* down */  
  57.                 && maze[p.row + 1][p.col] == 0)  
  58.             visit(p.row + 1, p.col);  
  59.         if (p.col - 1 >= 0 /* left */  
  60.                 && maze[p.row][p.col - 1] == 0)  
  61.             visit(p.row, p.col - 1);  
  62.         if (p.row - 1 >= 0 /* up */  
  63.                 && maze[p.row - 1][p.col] == 0)  
  64.             visit(p.row - 1, p.col);  
  65.         print_maze();  
  66.     }  
  67.     if (p.row == MAX_ROW - 1 && p.col == MAX_COL - 1) {  
  68.         printf("(%d, %d)\n", p.row, p.col);  
  69.         while (p.predecessor != -1) {  
  70.             p = queue[p.predecessor];  
  71.             printf("(%d, %d)\n", p.row, p.col);  
  72.         }  
  73.     } else  
  74.         printf("No path!\n");  
  75.   
  76.     return 0;  
  77. }  

当然,还可以优化。

你可能感兴趣的:(迷宫问题|深度优先搜索&广度优先搜索)