Zer0e's Blog

使用递归算法解决迷宫问题

字数统计: 771阅读时长: 4 min
2018/03/10 Share

最近看递归的问题有点多,也逐渐有了自己的想法和思路。对于递归问题,其实让人不理解的无非是它的逻辑思路,遇到不理解的地方在纸上写写逻辑,问题就迎刃而解了。

代码部分

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#include<stdio.h>
#define startX 1
#define startY 1
#define endX 8
#define endY 8

//由于遍历的不同导致迷宫走法不唯一
//这里采用下上左右的顺序来走迷宫
int TraceRoute(int a[10][10],int i,int j)
{
int end = 0;
//用2标记走过的地方
a[i][j]=2;
//end=1表示到达终点
if(i == endX&&j == endY)
end = 1;
//开始走迷宫,4种走法
//下
if(end != 1 && i + 1 <= endX && a[i+1][j] == 1)
{
if(TraceRoute(a,i+1,j) == 1)
return 1; //函数返回1后层层递归
}
//上
if(end != 1 && i - 1 >= startX && a[i-1][j] == 1)
{
if(TraceRoute(a,i-1,j) == 1)
return 1;
}
//左
if(end != 1 && j - 1 <= endY && a[i][j-1] == 1)
{
if(TraceRoute(a,i,j-1) == 1)
return 1;
}
//右
if(end != 1 && j + 1 >= startY && a[i][j+1] == 1)
{
if(TraceRoute(a,i,j+1) == 1)
return 1;
}
//如果走到死胡同,并且没到达终点,则将将前一个点还原为1
if(end == 0)
{
a[i][j] = 1;
}
return end;
}




int main()
{
int i,j;
//创建迷宫,1表示可走的地方,0表示墙壁
int a[10][10]={
{0,0,0,0,0,0,0,0,0,0},
{0,1,1,0,1,1,1,0,1,0},
{0,1,1,0,1,1,1,0,1,0},
{0,1,1,1,1,0,0,1,1,0},
{0,1,0,0,0,1,1,1,1,0},
{0,1,1,1,0,1,1,1,1,0},
{0,1,0,1,1,1,0,1,1,0},
{0,1,0,0,0,1,0,0,1,0},
{0,0,1,1,1,1,1,1,1,0},
{0,0,0,0,0,0,0,0,0,0}
};
for(i=0;i<10;i++)
{
for(j=0;j<10;j++)
{
printf("%d ",a[i][j]);
}
printf("\n");
}
if(TraceRoute(a,startX,startY) == 0)
{
printf("\n该迷宫没有路径可走!");
return 0;
}
printf("\n迷宫走法如下:\n");
for(i=0;i<10;i++)
{
for(j=0;j<10;j++)
{
printf("%d ",a[i][j]);
}
printf("\n");
}

return 0;
}

运行结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
0 0 0 0 0 0 0 0 0 0
0 1 1 0 1 1 1 0 1 0
0 1 1 0 1 1 1 0 1 0
0 1 1 1 1 0 0 1 1 0
0 1 0 0 0 1 1 1 1 0
0 1 1 1 0 1 1 1 1 0
0 1 0 1 1 1 0 1 1 0
0 1 0 0 0 1 0 0 1 0
0 0 1 1 1 1 1 1 1 0
0 0 0 0 0 0 0 0 0 0

迷宫走法如下:
0 0 0 0 0 0 0 0 0 0
0 2 1 0 1 1 1 0 1 0
0 2 1 0 1 1 1 0 1 0
0 2 1 1 1 0 0 1 1 0
0 2 0 0 0 1 1 1 1 0
0 2 2 2 0 1 1 1 1 0
0 1 0 2 2 2 0 1 1 0
0 1 0 0 0 2 0 0 1 0
0 0 1 1 1 2 2 2 2 0
0 0 0 0 0 0 0 0 0 0
CATALOG
  1. 1. 代码部分
  2. 2. 运行结果