亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 4239 | 回復: 2
打印 上一主題 下一主題

[算法] 走迷宮,depth first search,dfs,深度優(yōu)先搜索 [復制鏈接]

論壇徽章:
0
跳轉到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2013-10-26 20:40 |只看該作者 |倒序瀏覽
現(xiàn)在我們用堆棧解決一個有意思的問題,定義一個二維數(shù)組:

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、上一節(jié)我們實現(xiàn)了一個基于堆棧的程序,然后改寫成遞歸程序,用函數(shù)調(diào)用的棧幀替代自己實現(xiàn)的堆棧。本節(jié)的DFS算法也是基于堆棧的,請把它改寫成遞歸程序,這樣改寫可以避免使用predecessor數(shù)據(jù)結構,想想該怎么做。

倒序打。
  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 [報告]
發(fā)表于 2013-10-26 21:29 |只看該作者
廣度優(yōu)先法,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 [報告]
發(fā)表于 2013-10-27 15:39 |只看該作者
炫耀貼....
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復

  

北京盛拓優(yōu)訊信息技術有限公司. 版權所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關心和支持過ChinaUnix的朋友們 轉載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP