ネズミが迷路を歩く(1)唯一の経路を出力する(C言語)

15970 ワード

需要
迷路があり、迷路のある出口にチーズが置いてあります.ある入り口からネズミを入れ、迷路を通り抜けてチーズを見つけなければなりません.その歩行経路を見つけてください.
STEP 1テーマ変換
2次元配列で迷路を表し,2で迷路の壁を表し,0で通路を表す.マウスが1つの格子に着くたびに、その位置の値を1に設定し、マウスの歩行経路にこの格子が含まれていることを示します. 
STEP 2プログラミングの考え方
(1)この問題は再帰的な方法で,迷宮の出口にある格子まで最後の一歩を踏み出すだけでよい.
(2)各ステップは上、下、左、右の4つの方向をテストし、1つの方向を選択して前進する.
STEP 3要点整理
(1)通過した格子にはタグが必要です.そうしないと経路を出力できません.
(2)再帰アルゴリズムは再帰出口(すなわち終了条件)と分解後の問題を明らかにするだけで,あまり深く考えすぎてはいけない.
 
-----------------------------------------------------------------------------------------------------
 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:
"); // , , 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("
"); 36 } 37 38 if(step(start_x, start_y) == 0) 39 { 40 printf("No way!
"); 41 } 42 else 43 { 44 printf("You are free!
"); 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("
"); 58 } 59 } 60 61 printf("
"); 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、連絡先[email protected]