1 #include<stdio.h>
2 #include<stdlib.h>
3 typedef enum { ERROR, OK } Status;
4 typedef struct
5 {
6 int row, line;
7 }PosType;
8
9 typedef struct
10 {
11 int di, ord;
12 PosType seat;
13 }SElemType;
14
15 typedef struct
16 {
17 SElemType * base;
18 SElemType * top;
19 int stacksize;
20 }SqStack;
21
22 Status InitStack(SqStack &S);
23 Status Push(SqStack &S, SElemType &a);
24 Status Pop(SqStack &S, SElemType &a);
25 Status StackEmpty(SqStack S);
26 Status MazePath(int maze[12][12], SqStack &S, PosType start, PosType end);
27 void Initmaze(int maze[12][12], int size);
28 void printmaze(int maze[12][12], int size);
29 Status Pass(int maze[12][12], PosType CurPos);
30 void Markfoot(int maze[12][12], PosType CurPos);
31 PosType NextPos(PosType CurPos, int Dir);
32 void printpath(int maze[12][12], SqStack S, int size);
33 void main(void)
34 {
35 SqStack S;
36 int size, maze[12][12];
37 for (int n = 0; n < 10; n++)
38 {
39 printf("创建一个正方形迷宫,请输入迷宫尺寸(注意不要大于10):\n");
40 scanf_s("%d", &size);
41 if (size < 1 || size>10)
42 {
43 printf("输入错误!");
44 return;
45 }
46 Initmaze(maze, size);
47 printmaze(maze, size);
48 PosType start, end;
49 printf("输入入口行坐标和列坐标:");
50 scanf_s("%d", &start.row);
51 scanf_s("%d", &start.line);
52 printf("输入出口行坐标和列坐标:");
53 scanf_s("%d", &end.row);
54 scanf_s("%d", &end.line);
55 if (MazePath(maze, S, start, end))
56 printpath(maze, S, size);
57 else
58 printf("找不到通路!\n\n");
59 }
60 }
61 Status MazePath(int maze[12][12], SqStack &S, PosType start, PosType end)
62 {
63 PosType curpos;
64 int curstep;
65 SElemType e;
66 InitStack(S);
67 curpos = start;
68 curstep = 1;
69 do {
70 if (Pass(maze, curpos))
71 {
72 Markfoot(maze, curpos);//如果0可以通过,则标记为1
73 e.di = 1;//从第一个方向开始
74 e.ord = curstep;
75 e.seat = curpos;
76 Push(S, e);//放入栈S
77 if (curpos.row == end.row && curpos.line == end.line)//到达目的地,成功
78 return OK;
79 curpos = NextPos(curpos, 1);//继续向下一个探索
80 curstep++;
81 }
82 else//不能通过的情况
83 {
84 if (!StackEmpty(S))//栈不为空
85 {
86 Pop(S, e);//弹出栈元素,改变方向
87 while (e.di == 4 && !StackEmpty(S))
88 {
89 Markfoot(maze, e.seat);//标记为1
90 Pop(S, e);//弹出e
91 }
92 if (e.di < 4)
93 {
94 e.di++;
95 Push(S, e);
96 curpos = NextPos(e.seat, e.di);
97 }
98 }
99 }
100 } while (!StackEmpty(S));
101 return ERROR;
102 }
103 void Initmaze(int maze[12][12], int size)
104 {
105 char select;
106 printf("选择创建方式 A:自动生成 B:手动创建\n");
107 label:scanf_s("%c", &select);
108 if (select == 'a' || select == 'A')
109 {
110 for (int i = 0; i < size + 2; i++)
111 maze[0][i] = 1;
112 for (int i = 1; i < size + 1; i++)
113 {
114 maze[i][0] = 1;
115 for (int j = 1; j < size + 1; j++)
116 maze[i][j] = rand() % 2;
117 maze[i][size + 1] = 1;
118 }
119 for (int i = 0; i < size + 2; i++)
120 maze[size + 1][i] = 1;
121 }
122 else if (select == 'b' || select == 'B')
123 {
124 printf("按行输入%d*%d数据,0代表可通,1代表不可通(每行以Enter结束):\n", size, size);
125 for (int i = 0; i < size + 2; i++)maze[0][i] = 1;
126 for (int i = 1; i < size + 1; i++)
127 {
128 maze[i][0] = 1;
129 for (int j = 1; j < size + 1; j++)
130 scanf_s("%d", &maze[i][j]);
131 maze[i][size + 1] = 1;
132 }
133 for (int i = 0; i < size + 2; i++)
134 maze[size + 1][i] = 1;
135 }
136 else if (select == '\n')
137 goto label;
138 else printf("输入错误!");
139 }
140 void printmaze(int maze[12][12], int size)//
141 {
142 printf("\n\n");
143 printf("显示所建的迷宫(#表示外面的墙):\n");
144 for (int i = 0; i < size + 2; i++)
145 printf("%c ", '#');
146 printf("\n");
147 for (int i = 1; i < size + 1; i++)
148 {
149 printf("%c ", '#');
150 for (int j = 1; j < size + 1; j++)
151 {
152 printf("%d ", maze[i][j]);
153 }
154 printf("%c", '#');
155 printf("\n");
156 }
157 for (int i = 0; i < size + 2; i++)
158 printf("%c ", '#');
159 printf("\n");
160
161 }
162
163 void printpath(int maze[12][12], SqStack S, int size)
164 {
165 printf("\n\n通路路径为:\n");
166 SElemType * p = S.base;
167 while (p != S.top)
168 {
169 maze[p->seat.row][p->seat.line] = 2;
170 p++;
171 }
172 for (int i = 0; i < size + 2; i++)
173 printf("%c ", '#'); printf("\n");
174 for (int i = 1; i < size + 1; i++)
175 {
176 printf("%c ", '#');
177 for (int j = 1; j < size + 1; j++)
178 {
179 if (maze[i][j] == 2)
180 printf("%c ", '0');
181 else
182 printf(" ");
183 }
184 printf("%c", '#');
185 printf("\n");
186 }
187 for (int i = 0; i < size + 2; i++)
188 printf("%c ", '#');
189 printf("\n\n");
190
191 }
192
193 Status Pass(int maze[12][12], PosType CurPos)
194 {
195 if (maze[CurPos.row][CurPos.line] == 0)
196 return OK;
197 else
198 return ERROR;
199 }
200 void Markfoot(int maze[12][12], PosType CurPos)
201 {
202 maze[CurPos.row][CurPos.line] = 1;
203 }
204 PosType NextPos(PosType CurPos, int Dir)
205 {
206 PosType ReturnPos;
207 switch (Dir)
208 {
209 case 1:
210 ReturnPos.row = CurPos.row;
211 ReturnPos.line = CurPos.line + 1;
212 break;
213 case 2:
214 ReturnPos.row = CurPos.row + 1;
215 ReturnPos.line = CurPos.line;
216 break;
217 case 3:
218 ReturnPos.row = CurPos.row;
219 ReturnPos.line = CurPos.line - 1;
220 break;
221 case 4:
222 ReturnPos.row = CurPos.row - 1;
223 ReturnPos.line = CurPos.line;
224 break;
225 }
226 return ReturnPos;
227 }
228 Status InitStack(SqStack &S)
229 {
230 S.base = (SElemType *) malloc(100 * sizeof(SElemType));
231 if (!S.base)return ERROR;
232 S.top = S.base;
233 S.stacksize = 100;
234 return OK;
235 }
236 Status Push(SqStack &S, SElemType &a)
237 {
238 *S.top++ = a;
239 return OK;
240 }
241 Status Pop(SqStack &S, SElemType &a)
242 {
243 if (S.top == S.base)
244 return ERROR;
245 a = *--S.top;
246 return OK;
247 }
248
249 Status StackEmpty(SqStack S)
250 {
251 if (S.top == S.base)
252 return OK;
253 return ERROR;
254 }