老鼠走迷宮(1)輸出唯一路徑(C語言)


需求  

  有一個迷宮,在迷宮的某個出口放着一塊奶酪。將一只老鼠由某個入口處放進去,它必須穿過迷宮,找到奶酪。請找出它的行走路徑。

STEP 1 題目轉化

  我們用一個二維數組來表示迷宮,用2表示迷宮的牆壁,用0表示通路。
  老鼠每走到一個格子的時候就將該位置的值置為1,表示老鼠的行走路徑包括這個格子。 

STEP 2 編程思路

  ⑴這個題目可以用遞歸方法,只需要最后一步走到迷宮出口所在的格子。

  ⑵每一步測試上、下、左、右四個方向,選擇一個方向前進。

STEP 3 要點整理

  ⑴走過的格子需要標記,否則無法輸出路徑。

  ⑵遞歸算法只需弄清遞歸出口(即結束條件)和分解后的問題,切忌想得太深太遠。

 

----------------------------------華麗麗的分割線---------------------------代碼君要出場了-------------------

 1 #include <stdio.h>
 2 
 3 int maze[9][9] = {
 4     {2, 2, 2, 2, 2, 2, 2, 2, 2},
 5     {0, 0, 2, 2, 2, 2, 0, 2, 2},
 6     {2, 0, 0, 0, 0, 0, 0, 0, 2},
 7     {2, 0, 2, 2, 0, 2, 2, 0, 2},
 8     {0, 2, 0, 2, 0, 2, 2, 0, 2},
 9     {2, 2, 0, 2, 0, 2, 2, 0, 2},
10     {2, 2, 0, 2, 0, 0, 0, 0, 2},
11     {2, 2, 0, 2, 0, 2, 2, 2, 2},
12     {2, 2, 2, 2, 0, 2, 2, 2, 2},
13 };                                          //構建迷宮
14 
15 int start_x = 1, start_y = 0;               //設置起點
16 int end_x = 8, end_y = 4;                   //設置終點
17 int success = 0;
18 
19 int step(int x, int y);
20 
21 int main(int argc, char argv[])
22 {
23     int x, y;    
24 
25     printf("maze:\n");                    //打印迷宮圖,為方便查看,將數字換為圖形打印
26     for(x = 0; x < 9; x++)
27     {
28         for(y = 0; y < 9; y++)
29         {
30             if(maze[x][y] == 2)
31                 printf("");
32             else
33                 printf("");
34         }
35         printf("\n");
36     }
37 
38     if(step(start_x, start_y) == 0)
39     {
40         printf("No way!\n");
41     }
42     else
43     {
44         printf("You are free!\n");
45     
46         for(x = 0; x < 9; x++)
47         {
48             for(y = 0; y < 9; y++)
49             {
50                 if(maze[x][y] == 2)
51                     printf("");
52                 else if(maze[x][y] == 1) 
53                     printf("");
54                 else
55                     printf("");
56             }
57         printf("\n");
58         }
59     }
60 
61     printf("\n");
62     return 0;
63 }
64 
65 
66 int step(int x, int y)           //用遞歸算法求解路徑                 
67 {
68     maze[x][y] = 1;
69 
70     if(x == end_x && y == end_y)
71     {
72         success = 1;
73     }
74 
75     if(success != 1 && y < (LEN - 1) && maze[x][y + 1] == 0){step(x, y + 1);}
76     if(success != 1 && x > 0 && maze[x][y - 1] == 0){step(x, y - 1);}
77     if(success != 1 && x < (LEN - 1) && maze[x + 1][y] == 0){step(x + 1, y);}
78     if(success != 1 && y > 0 && maze[x - 1][y] == 0){step(x - 1, y);}
79 
80     if(success != 1)
81     {
82         maze[x][y] = 0;
83     }
84 
85     return success;
86 }

 

歡迎轉載,請備注原始連接http://www.cnblogs.com/liuliuliu/p/3885026.html,並注明轉載。

作者bibibi_liuliu,聯系方式395985239@qq.com


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM