ネズミが迷路を歩く(1)唯一の経路を出力する(C言語)
15970 ワード
需要
迷路があり、迷路のある出口にチーズが置いてあります.ある入り口からネズミを入れ、迷路を通り抜けてチーズを見つけなければなりません.その歩行経路を見つけてください.
STEP 1テーマ変換
2次元配列で迷路を表し,2で迷路の壁を表し,0で通路を表す.マウスが1つの格子に着くたびに、その位置の値を1に設定し、マウスの歩行経路にこの格子が含まれていることを示します.
STEP 2プログラミングの考え方
(1)この問題は再帰的な方法で,迷宮の出口にある格子まで最後の一歩を踏み出すだけでよい.
(2)各ステップは上、下、左、右の4つの方向をテストし、1つの方向を選択して前進する.
STEP 3要点整理
(1)通過した格子にはタグが必要です.そうしないと経路を出力できません.
(2)再帰アルゴリズムは再帰出口(すなわち終了条件)と分解後の問題を明らかにするだけで,あまり深く考えすぎてはいけない.
-----------------------------------------------------------------------------------------------------
転載を歓迎して、原始の接続を備考してくださいhttp://www.cnblogs.com/liuliuliu/p/3885026.html、転載を明記します.
作者bibibi_Liuliu、連絡先[email protected]
迷路があり、迷路のある出口にチーズが置いてあります.ある入り口からネズミを入れ、迷路を通り抜けてチーズを見つけなければなりません.その歩行経路を見つけてください.
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]