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)的位置
墙赋值为1,走过的路标记为2,未走过的路记为0
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 stack[100][2]; //定义一个存放路径的栈
int top = -1; //定义一个栈顶指针top
int cnt = 0;
//输出
void Print() {
int i;
printf("第%d组解:\n", ++cnt);
printf("(%d,%d)", 1, 1);
for (i = 0; i < top + 1; i++) {
printf("->(%d,%d)", stack[i][0], stack[i][1]);
}
printf("\n");
}
void Maze(int x, int y) {
int a = 0, b = 0;
if (x == rol&&y == col) {
Print();
//return 1; //当走到出口时,返回1
}
else {
for (int i = 0; i < 4; i++) { //遍历四个方向
a = x + Move[i][0];
b = y + Move[i][1]; //给a,b赋值
if (!M[a][b]) { //如果M[a][b]能走并且没有被走过
M[a][b] = 2; //此时给M[a][b]赋2记录此处被走过
//入栈
top++;
stack[top][0] = a;
stack[top][1] = b;
Maze(a, b); //并且在此处进行调用,走到下一个节点位置
M[a][b] = 0; //抹掉标记
top--; //出栈
}
}
}
}
int main(void) {
int i, j;
stack[0][0] = stack[0][1] = 1; //初始化栈底元素为1,1,即从1,1开始这个节点开始跑
for (i = 0; i < rol + 2; i++) {
for (j = 0; j < col + 2; j++) {
printf("%2d", M[i][j]);
}
printf("\n");
}
M[1][1] = 1;
Maze(1, 1);
return 0;
}