1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | ||
1 | 1 | 1 | 1 | 1 | 1 | 1 | |||
1 | 1 | 1 | 1 | ||||||
1 | 1 | 1 | 1 | 1 | 1 | ||||
1 | 1 | 1 | 1 | ||||||
1 | 1 | 1 | 1 | 1 | 1 | ||||
1 | 1 | 1 | 1 | 1 | 1 | 1 | |||
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
本题定义一个七行八列的数组迷宫,为了方便算法实现,在最外围再加上“一堵墙”,然后在初始化时就将人放在M(1,1)的位置
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
2.再定义一个迷宫对照表格,初始化为0,记录走过迷宫的路,走过赋1
1 | 0 |
0 | 1 |
-1 | 0 |
0 | -1 |
往南走,x记为1,y仍是0,以此类推
代码实现如下:
#include<stdio.h>
#include<stdlib.h>
#define rol 7 //定义迷宫的行
#define col 8 //定义迷宫的列
int Move[4][2] = { {1,0},{0,1},{-1,0},{0,-1} }; //定义四个方向存入二维数组,顺序为:南东北西
int M[rol + 2][col + 2] = { {1,1,1,1,1,1,1,1,1,1},{1,0,0,1,1,1,1,1,1,1},
{1,0,0,0,1,1,1,1,1,1},{1,0,0,0,0,0,0,1,1,1},{1,0,1,0,0,1,0,1,1,1},{1,0,0,1,0,1,0,0,0,1},
{1,1,1,1,0,0,0,1,0,1},{1,1,1,1,1,1,0,0,0,1},{1,1,1,1,1,1,1,1,1,1} }; //用最笨的办法直接给迷宫赋值
int t[rol + 2][col + 2] = { 0 }; //定义一个和迷宫M一样大的迷宫用来存储该结点是否走过,初始化为0,走过的结点赋1
int Moze(int x, int y) {
int a = 0, b = 0;
int tag;
if (x == rol&&y == col) return 1; //当走到出口时,返回1
for (int i = 0; i < 4; i++) { //遍历四个方向
a = x + Move[i][0];
b = y + Move[i][1]; //给a,b赋值
if (!M[a][b] && !t[a][b]) { //如果M[a][b]能走并且没有被走过
t[a][b] = 1; //此时给t[a][b]赋1记录此处被走过
tag = Moze(a, b); //并且在此处进行调用,走到下一个节点位置
if (!(tag - 1)) {
printf("%d,%d\n", a, b);
return tag;
}
}
}
//如果没有调用直接从循环出来,说明无路可走,此时回溯到上一次调用的位置
}
int main(void) {
//int i, j;
//初始化迷宫最外层的墙,为其初始化为1
/*for (i = 0; i < rol + 2; i++) {
for (j = 0; j < col + 2; j++) {
M[i][j] = 0;
if (i == 0 || j == 0 || i == rol + 1 || j == col + 1) {
M[i][j] = 1;
}
}
}*/
Moze(1, 1);
printf("%d,%d",1,1);
return 0;
}