一、程序源代码:
1 #include <iostream>
2 using namespace std;
3
4 #include <stdio.h>
5
6 #define M 2
7 #define N 2
8 #define MAXSIZE 20
9 #define RIGHT 0
10 #define DOWN 1
11 #define LEFT 2
12 #define UP 3
13 #define DIRECTIONS 4
14
15 typedef struct datatype
16 {
17 int x;
18 int y;
19 int d;
20 char dir[6];
21 }datatype;
22
23 int maze[M][N]={
24 0,1,
25 0,0,
26 };
27
28 typedef struct seqstack
29 {
30 datatype data[MAXSIZE];
31 int top;
32 }seqstack;
33 seqstack seq;
34 seqstack *s;
35 datatype temp;
36
37 void print_maze()
38 {
39 int i,j;
40 for(i=0;i<M;i++)
41 {
42 if(i == 0)
43 {
44 printf(" ");
45 for(j=0;j<N;j++)
46 printf("C%d ",j);
47 printf("\n");
48 }
49 printf("R%d ",j);
50
51 for(j=0;j<N;j++)
52 printf("%2d",maze[i][j]);
53 printf("\n");
54 }
55 }
56
57 int push_stack(seqstack *s,datatype x)
58 {
59 if(s->top == MAXSIZE -1 )
60 return 0;
61 else
62 {
63 s->top++;
64 s->data[s->top]=x;
65 return 1;
66 }
67 }
68
69 int empty_stack(seqstack *s)
70 {
71 if(s->top == 0)
72 return 1;
73 else
74 return 0;
75 }
76
77 int pop_stack(seqstack *s,datatype *x)
78 {
79 if(empty_stack(s))
80 return 0;
81 else
82 {
83 *x= s->data[s->top];
84 s->top--;
85 return 1;
86 }
87 }
88
89 int mazepath(int maze[][N],datatype move[])
90 {
91 int x=0, y=0;
92 int i=0,j=0;
93 int d=-1;
94
95 temp.x=0;
96 temp.y=0;
97 temp.d=-1;
98 maze[0][0]=-1;
99 push_stack(s,temp);
100
101 while(!empty_stack(s))
102 {
103 pop_stack(s,&temp);
104 x=temp.x;
105 y=temp.y;
106 d=temp.d+1;
107
108 while(d < DIRECTIONS)
109 {
110 switch(d)
111 {
112 case RIGHT:
113 if( y == N-1)
114 d++;
115 else
116 j = y + move[d].y;
117 i = x + move[d].x;
118 break;
119 case DOWN:
120 if(x == M-1)
121 d++;
122 else
123 i = x + move[d].x;
124 j = y + move[d].y;
125 break;
126 case LEFT:
127 if( y == 0)
128 d++;
129 else
130 j = y + move[d].y;
131 i = x + move[d].x;
132
133
134 break;
135 case UP:
136 if(x == 0)
137 d++;
138 else
139 i = x + move[d].x;
140 j = y + move[d].y;
141 break;
142 }
143
144 if(maze[i][j] == 0)
145 {
146 temp.x=x;
147 temp.y=y;
148 temp.d=d;
149 push_stack(s,temp);
150 x=i;
151 y=j;
152 if((x+1) == M && (y+1) == N)
153 return 1;
154 else
155 d=0;
156 }
157 else
158 d++;
159 }
160
161 return 0;
162 }
163 }
164
165 int main()
166 {
167 int r;
168 int x=0,y=0;
169
170 datatype move[4]={
171 0, 1, 0, "RIGHT",
172 1, 0, 1, "DOWN",
173 0,-1, 2, "LEFT",
174 -1, 0, 3, "UP",
175 };
176
177 s=&seq;
178 printf("The maze array:\n");
179 print_maze();
180 r=mazepath(maze,move);
181 if(r == 1)
182 {
183 printf("The valid path is (step from exit to entry):\n");
184 while(!empty_stack(s))
185 {
186 pop_stack(s,&temp);
187 printf("<%d, %2d>,%s\n",temp.x,temp.y,move[temp.d].dir);
188 }
189 }
190 else
191 printf("There is not a valid path!\n");
192 return 0;
193 }
二、执行结果:
The maze array:
C0 C1
R2 0 1
R2 0 0
The valid path is (step from exit to entry):
<1, 0>,RIGHT
<0, 0>,DOWN
三、收获:
1.熟悉了栈:判断栈空,入栈,出栈......
2.多种数据结构的定义
3.迷宫问题有了初步认识
四、不足之处:
1.对迷宫问题逻辑还不是很强,还可以再仔细分析一下,找出能计算出多种结果的方案。
2.还总结比较一下堆栈的使用