Skip to content

Commit c72176d

Browse files
authored
Create 迷宫问题.c
1 parent 0e44f2b commit c72176d

File tree

1 file changed

+147
-0
lines changed

1 file changed

+147
-0
lines changed

DataStructExperiment/迷宫问题.c

Lines changed: 147 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,147 @@
1+
/* 实验十三 迷宫问题 */
2+
3+
#include <stdio.h>
4+
#define MaxSize 100
5+
#define M 8
6+
#define N 8
7+
int mg[M + 2][N + 2] =
8+
{
9+
{1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
10+
{1, 0, 0, 1, 0, 0, 0, 1, 0, 1},
11+
{1, 0, 0, 1, 0, 0, 0, 1, 0, 1},
12+
{1, 0, 0, 0, 0, 1, 1, 0, 0, 1},
13+
{1, 0, 1, 1, 1, 0, 0, 0, 0, 1},
14+
{1, 0, 0, 0, 1, 0, 0, 0, 0, 1},
15+
{1, 0, 1, 0, 0, 0, 1, 0, 0, 1},
16+
{1, 0, 1, 1, 1, 0, 1, 1, 0, 1},
17+
{1, 1, 0, 0, 0, 0, 0, 0, 0, 1},
18+
{1, 1, 1, 1, 1, 1, 1, 1, 1, 1}}; //构造地图
19+
typedef struct
20+
{
21+
int i; //当前方块的行号
22+
int j; //当前方块的列号
23+
int di; //di是下一可走相邻方位的方位号---上下左右的标记
24+
} Box;
25+
typedef struct
26+
{
27+
Box data[MaxSize]; //是用来存储位置坐标的,当MaxSize<位置坐标的数目时,则程序出错,停止运行
28+
int top; //栈顶指针
29+
} StType; //定义栈类型
30+
//该栈中:每一个位置用于存储Box,该栈对应了一个int型的top作为指针,依次移动,方便对栈中每一个位置进行操作,而Box中,存储了该迷宫位置的横坐标,纵坐标,和从上一位置移动到该位置所对应的方向数值
31+
int mgpath(int xi, int yi, int xe, int ye) //求解路径为:(xi,yi)->(xe,ye)
32+
//初位置横坐标,初位置纵坐标,终点横坐标,终点纵坐标
33+
{
34+
int i, j, k, di, find;
35+
StType st; //定义栈st
36+
st.top = -1; //初始化栈顶指针
37+
st.top++; //初始方块进栈
38+
st.data[st.top].i = xi; //栈底一号存入横坐标数值
39+
st.data[st.top].j = yi; //栈底一号存入纵坐标数值
40+
st.data[st.top].di = -1; //????????????????????????????????
41+
mg[xi][yi] = -1;
42+
while (st.top > -1) //栈不空时循环
43+
{
44+
i = st.data[st.top].i;
45+
j = st.data[st.top].j;
46+
di = st.data[st.top].di; //取栈顶方块
47+
if (i == xe && j == ye) //找到了出口,输出路径
48+
{
49+
printf("迷宫路径如下:\n");
50+
for (k = 0; k <= st.top; k++)
51+
{
52+
printf("\t(%d,%d)", st.data[k].i, st.data[k].j);
53+
if ((k + 1) % 5 == 0) //每输出5个元素,就换行
54+
printf("\n");
55+
}
56+
printf("\n");
57+
return 0; //找到路径之后,将所有路径打印出来,然后,程序结束
58+
}
59+
find = 0;
60+
while (di < 4 && find == 0) //找下一个可走方块
61+
{
62+
di++;
63+
switch (di)
64+
{
65+
case 0: //向上走
66+
i = st.data[st.top].i - 1;
67+
j = st.data[st.top].j;
68+
break;
69+
case 1: //向右走
70+
i = st.data[st.top].i;
71+
j = st.data[st.top].j + 1;
72+
break;
73+
case 2: //向下走
74+
i = st.data[st.top].i + 1;
75+
j = st.data[st.top].j;
76+
break;
77+
case 3: //向左走
78+
i = st.data[st.top].i;
79+
j = st.data[st.top].j - 1;
80+
break;
81+
}
82+
if (mg[i][j] == 0)
83+
find = 1; //mg[i][j]==0说明:该点可以走--------------(该点为此时所在点的下一预判点)
84+
}
85+
if (find == 1) //找到了下一个可走方块
86+
{
87+
st.data[st.top].di = di; //修改原栈顶元素的di值
88+
st.top++; //下一个可走方块进栈
89+
st.data[st.top].i = i;
90+
st.data[st.top].j = j;
91+
st.data[st.top].di = -1; //再次初始化方向数值
92+
mg[i][j] = -1; //避免重复走到该方块-----------------------//让每一个点都变成起点,因此,既满足递归的条件,也避免重复走到该位置
93+
}
94+
else //没有路径可走,则退栈-----------???????????为什么要退栈?不是刚刚只判断了一个方向吗?
95+
{
96+
mg[st.data[st.top].i][st.data[st.top].j] = 0; //让该位置变为其他路径可走方块
97+
st.top--; //将该方块退栈
98+
}
99+
}
100+
return (0); //表示没有可走路径,返回0
101+
}
102+
int main()
103+
{
104+
int x, y, k, t;
105+
printf("终点坐标为:(8,8)\n");
106+
while (1)
107+
{
108+
printf("请输入起点坐标:\n");
109+
printf("(横坐标范围:0~9,纵坐标范围:0~9)\n");
110+
scanf("%d %d", &x, &y);
111+
if (mg[x][y] == 1)
112+
{
113+
printf("输入坐标有误,该位置为墙,请重新输入:\n");
114+
}
115+
else
116+
{
117+
break;
118+
}
119+
}
120+
mgpath(x, y, M, N);
121+
printf("\n\n图像表示:\n");
122+
for (t = 0; t < 10; t++)
123+
{
124+
printf("\t\t");
125+
for (k = 0; k < 10; k++)
126+
{
127+
if (mg[t][k] == 1)
128+
{
129+
printf("#");
130+
}
131+
else if (mg[t][k] == 0)
132+
{
133+
printf(" ");
134+
}
135+
else
136+
{
137+
printf("o");
138+
}
139+
}
140+
if (k == 10)
141+
{
142+
printf("\n");
143+
}
144+
}
145+
printf("\n此时,o所代表的图标为迷宫行走路径!!!\n");
146+
return 0;
147+
}

0 commit comments

Comments
 (0)