【问题描述】
以一个mXn的矩阵表示迷宫,0和1分别表示迷宫中的通路和障碍。设计一个程序,对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。
【任务要求】
实现链栈求解迷宫从入口到出口的一条可行通路。
【测试数据】
迷宫的测试数据如下:左上角(0,1)为入口,右下角(8,9)为出口。
代码:
#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
int X;
int Y;
struct node *next;
}NODE;
typedef struct
{
struct NODE *top;
int cnt;
}STACK;
STACK *Creatstack()//创建链栈
{
STACK *S;
S = (STACK *)malloc(sizeof(STACK));
if (S == NULL)
{
printf("创建失败");
exit(1);
}
else
{
S->top = NULL;
S->cnt = 0;
}
return S;
}
void Iputstack(STACK *S, int x, int y)
{
NODE *s;
s = (NODE *)malloc(sizeof(NODE));
if (s != NULL)
{
s->X = x;
s->Y = y;
s->next = S->top;//S->top是和s同样类型的结点,将新结点的后继指向一个地址(这个地址其实可以看成是单链表的头结点看待)
S->top = s;//给指向的地址复制,其实可以看成是把栈顶指针指向新结点
S->cnt++;
}
}
void Outstack(STACK *S)
{
if (S->top != NULL)
{
NODE *s,*p;
s = S->top;
p=s->next;
free(s);
S->top = p;
S->cnt--;
}
}
int main()
{
int i;
STACK *S;
NODE *p;
int Hx, Hy, Ex, Ey,Px,Py;
S = Creatstack();
int M[10][10] = {
{ 1,0,1,1,1,1,1,1,1,1 },
{ 1,0,0,1,0,0,0,1,0,1 },
{ 1,0,0,1,0,0,0,1,0,1 },
{ 1,0,0,0,0,1,1,0,0,1 },
{ 1,0,1,1,1,0,0,0,0,1 },
{ 1,0,0,0,1,0,0,0,0,1 },
{ 1,0,1,0,0,0,1,0,0,1 },
{ 1,0,1,1,1,0,1,1,0,1 },
{ 1,1,0,0,0,0,0,0,0,0 },
{ 1,1,1,1,1,1,1,1,1,1 }
};
Hx= 0; Hy = 1;
Ex = 8; Ey = 9;
Px = Hx, Py = Hy;
Iputstack(S, Hx, Hy);
while (S->top != NULL)//栈空表示无路可走
{
p = S->top;//每次循环都把栈中的栈顶的地址给p
Px = p->X; Py = p->Y;//把栈顶的X,Y值取出来作为本次循环的起始坐标点
if (Px == Ex&&Py == Ey)//找到出口,跳出循环
break;
if (M[Px-1][Py] == 0)//上方向
{
Iputstack(S, Px-1, Py);//满足条件的入栈,下面代码同理
M[Px - 1][Py] = 2;//表示走过
}
else if (M[Px + 1][Py] == 0)//下方向
{
Iputstack(S, Px+1, Py);
M[Px + 1][Py] = 2;//表示走过
}
else if (M[Px][Py-1] == 0)//左方向
{
Iputstack(S, Px-1, Py);
M[Px][Py-1] = 2;//表示走过
}
else if (M[Px][Py+1] == 0)//右方向
{
Iputstack(S, Px, Py+1);
M[Px][Py+1] = 2;//表示走过
}
else
{
Outstack(S);
M[Px][Py] = 3;
}
}
p = S->top;//p指向栈顶
for (i = 0; i < S->cnt; i++)//输出栈中值
{
printf("(%d,%d)\n", p->X, p->Y);
p = p->next;//p每次循环完指向后继结点
}
return 0;
}