免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4160 | 回复: 2
打印 上一主题 下一主题

[算法] 走迷宫,depth first search,dfs,深度优先搜索 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-10-26 20:40 |只看该作者 |倒序浏览
现在我们用堆栈解决一个有意思的问题,定义一个二维数组:

int maze[5][5] = {
        0, 1, 0, 0, 0,
        0, 1, 0, 1, 0,
        0, 0, 0, 0, 0,
        0, 1, 1, 1, 0,
        0, 0, 0, 1, 0,
};

它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的路线。

3、上一节我们实现了一个基于堆栈的程序,然后改写成递归程序,用函数调用的栈帧替代自己实现的堆栈。本节的DFS算法也是基于堆栈的,请把它改写成递归程序,这样改写可以避免使用predecessor数据结构,想想该怎么做。

倒序打印:
  1. #include <stdio.h>

  2. #define MAX_ROW 5
  3. #define MAX_COL 5

  4. struct point { int row, col; };
  5. int maze[MAX_ROW][MAX_COL] = {
  6.     {0, 1, 0, 0, 0},
  7.     {0, 1, 0, 1, 0},
  8.     {0, 0, 0, 0, 0},
  9.     {0, 1, 1, 1, 0},
  10.     {0, 0, 0, 1, 0},
  11. };

  12. int explore(struct point p){
  13.     if (p.row == MAX_ROW - 1  /* goal */
  14.             && p.col == MAX_COL - 1)
  15.         return 1;
  16.     struct point next;
  17.     if (p.col+1 < MAX_COL     /* right */
  18.             && maze[p.row][p.col+1] == 0){
  19.         maze[p.row][p.col+1] = 2;
  20.         next.row=p.row;
  21.         next.col=p.col+1;
  22.         if(explore(next)==1){
  23.             printf("(%d, %d), ", next.row, next.col);
  24.             return 1;
  25.         }
  26.     }

  27.     if (p.row+1 < MAX_ROW     /* down */
  28.             && maze[p.row+1][p.col] == 0)
  29.     {
  30.         maze[p.row+1][p.col] = 2;
  31.         next.row=p.row+1;
  32.         next.col=p.col;
  33.         if(explore(next)==1){
  34.             printf("(%d, %d), ", next.row, next.col);
  35.             return 1;
  36.         }
  37.     }

  38.     if (p.col-1 >= 0          /* left */
  39.             && maze[p.row][p.col-1] == 0)
  40.     {
  41.         maze[p.row][p.col-1] = 2;
  42.         next.row=p.row;
  43.         next.col=p.col-1;
  44.         if(explore(next)==1){
  45.             printf("(%d, %d), ", next.row, next.col);
  46.             return 1;
  47.         }
  48.     }

  49.     if (p.row-1 >= 0          /* up */
  50.             && maze[p.row-1][p.col] == 0)
  51.     {
  52.         maze[p.row-1][p.col] = 2;
  53.         next.row=p.row-1;
  54.         next.col=p.col;
  55.         if(explore(next)==1){
  56.             printf("(%d, %d), ", next.row, next.col);
  57.             return 1;
  58.         }
  59.     }
  60.     return -1;
  61. }

  62. int main(void)
  63. {
  64.     struct point p = { 0, 0 };
  65.     if(explore(p)!=1){
  66.         printf("no path!\n");
  67.     }
  68.     else
  69.         printf("(%d, %d)\n", p.row, p.col);
  70.     return 0;
  71. }
复制代码

论坛徽章:
0
2 [报告]
发表于 2013-10-26 21:29 |只看该作者
广度优先法,breadth first search,bfs
  1. #include <stdio.h>

  2. #define MAX_ROW 5
  3. #define MAX_COL 5

  4. struct point { int row, col, predecessor; } queue[512];
  5. int head = 0, tail = 0;

  6. void enqueue(struct point p)
  7. {
  8.     queue[tail++] = p;
  9. }

  10. struct point dequeue(void)
  11. {
  12.     return queue[head++];
  13. }

  14. int is_empty(void)
  15. {
  16.     return head == tail;
  17. }

  18. int maze[MAX_ROW][MAX_COL] = {
  19.     {0, 1, 0, 0, 0},
  20.     {0, 1, 0, 1, 0},
  21.     {0, 0, 0, 0, 0},
  22.     {0, 1, 1, 1, 0},
  23.     {0, 0, 0, 1, 0}
  24. };

  25. void print_maze(void)
  26. {
  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. void visit(int row, int col)
  36. {
  37.     struct point visit_point = { row, col, head-1 };
  38.     maze[row][col] = 2;
  39.     enqueue(visit_point);
  40. }

  41. int main(void)
  42. {
  43.     struct point p = { 0, 0, -1 };

  44.     maze[p.row][p.col] = 2;
  45.     enqueue(p);
  46.    
  47.     while (!is_empty()) {
  48.         p = dequeue();
  49.         if (p.row == MAX_ROW - 1  /* goal */
  50.             && p.col == MAX_COL - 1)
  51.             break;
  52.         if (p.col+1 < MAX_COL     /* right */
  53.             && maze[p.row][p.col+1] == 0)
  54.             visit(p.row, p.col+1);
  55.         if (p.row+1 < MAX_ROW     /* down */
  56.             && maze[p.row+1][p.col] == 0)
  57.             visit(p.row+1, p.col);
  58.         if (p.col-1 >= 0          /* left */
  59.             && maze[p.row][p.col-1] == 0)
  60.             visit(p.row, p.col-1);
  61.         if (p.row-1 >= 0          /* up */
  62.             && maze[p.row-1][p.col] == 0)
  63.             visit(p.row-1, p.col);
  64.         print_maze();
  65.     }
  66.     if (p.row == MAX_ROW - 1 && p.col == MAX_COL - 1) {
  67.         printf("(%d, %d)\n", p.row, p.col);
  68.         while (p.predecessor != -1) {
  69.             p = queue[p.predecessor];
  70.             printf("(%d, %d)\n", p.row, p.col);
  71.         }
  72.     } else
  73.         printf("No path!\n");

  74.     return 0;
  75. }
复制代码

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
3 [报告]
发表于 2013-10-27 15:39 |只看该作者
炫耀贴....
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP