链栈求解迷宫

【问题描述】

以一个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;


}


问题描述: 以一个m*n的长方阵表示迷宫,0和1分别表示迷宫通路障碍设计一个程序,对任意设定的迷宫,求出从入口(0,0)到出口(m-1,n-1)的通路通路总数,或得出没有通路的结论。例如下图, 0(入口) 1 0 1 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0(出口) 从入口到出口有6条不同的通路。 而下图: 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0 0 1 1 0 1 0 1 1 1 0 0 1 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 1 0 1 1 1 1 0 0 1 1 1 0 0 0 1 0 1 1 1 0 0 0 0 0 0 从入口到出口则没有通路。 算法设计: 给定一个m*n的长方阵表示迷宫设计算法输出入口到出口的通路通路总数,或得出没有通路的结论。 算法提示: 和皇后问题与分书问题类似。可以用二维数组存储迷宫数据,对于迷宫任一位置,均可约定有东、南、西、北四个方向可通。从当前位置a(用(x,y)表示一个位置,假定它是以向右的x轴和向下的y轴组成的平面上的一个点)出发依次尝试四个方向是否有路,若某个方向的位置b可通,则按照同样的方法继续从b出发寻找。若到达出口,则找到一条通路。 数据输入: 由文件input.txt 提供输入数据。第一行是m和n的值,空格分隔,其后共m行。每行有n个数字,数和数之间用空格分隔。 结果输出: 将计算出的所有从入口到出口的通路输出到文件output.txt 。若没有通路,则将0写入文件
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值