数据结构之——栈的应用(迷宫)

本文介绍了一种使用栈数据结构实现的迷宫寻路算法。通过定义迷宫为数字矩阵形式,0代表通路,1代表障碍,并设定起始与终点坐标。利用栈记录路径,实现了从起点到终点的有效路径查找。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  最近几天学习数据结构的栈,碰巧看到了一个迷宫寻找路径的算法,稍微琢磨了一下。

1。为了简化,迷宫设计成数字样式,如下:

    定义入口坐标为(1,1),出口坐标为(6,8)。

    1代表不通,0代表通路,迷宫四周全为1。这样使每个点都可以向上下左右四个方向试探,不用判断当前的试探方向有几个。

2。

    

    规定从(x,y+1)开始沿顺时针方向开始试探,将四个方向坐标放在一个move[4]数组里面。

    typedef struct{

         int x,y;

    }item;

    item move[4];

    则新坐标为x=x+move[i].x,y=y+move[i].y;

3。  进栈元素为到达的各点坐标,还有前一点到达本点的方向,如下:

        typedef struct{

            int x,y,d;

        }DataType;

        栈仍然为顺序栈。

4。为了防止走重复的路,将每次走过的点maze[i]设为-1,起到区别作用。

5。算法思想:

    (1)栈初始化。

    (2)将入口坐标及到达该点的方向(设为-1)入栈。

    (3)while(栈不空)

    {

        出栈;

        试探下一个方向,d++;

        while(存在剩余可以试探的方向)

        {

            if(d方向可走)

            {

                将(x,y,d)入栈;

                求新点坐标(i,j);

                将新点(i,j)换成当前点(x,y);

                if((x,y)==(m,n))

                {

                    m,n进栈;

                    结束;

                }

                else

                    重置d=0;

            }

        else d++;

    }

}

6。算法如下,顺序栈部分代码参考上一篇博客

/*求迷宫路径,入口参数:指向迷宫数组的指针,下标移动的增量数组,开始点(x0,y0),到达点(m,n),
返回值:1表示求出路径,0表示无路径*/
int MazePath(int maze[][n + 2] ,Item move[],int x0,int y0)
{
	PSeqStack S;
	DateType temp;
	int x,y,d,i,j;

	temp.x = x0;
	temp.y = y0;
	temp.d = -1;
	S = Init_SeqStack();

	if(!S)
	{
		printf("初始化失败!\n");
		return 0;
	}

	Push_SeqStack(S,temp);    //迷宫入口点入栈

	while(!Empty_SeqStack(S))
	{
		Pop_SeqStack(S,&temp);

		x = temp.x;
		y = temp.y;
		d = temp.d + 1;

		while(d < 4)    //向剩余方向搜索
		{
			i = x + move[d].x;
			j = y + move[d].y;

			if(maze[i][j] == 0)    //此方向可以走
			{
				temp.x = x;
				temp.y = y;
				temp.d = d;

				Push_SeqStack(S,temp);    //点(x,y)可以走,用栈保存路径

				x = i;
				y = j;
				maze[x][y] = -1;

				if(x == m && y == n)
				{
					temp.x = m;
					temp.y = n;
					Push_SeqStack(S,temp);

					while(!Empty_SeqStack(S))
					{
						Pop_SeqStack(S,&temp);
						printf("(%d,%d) <- ",temp.x,temp.y);
					}
					Destory_SeqStack(&S);
					return 1;
				}
				else
					d = 0;    //方向复位
			}
			else
				d++;    //试探下一个方向
		}
	}
	Destory_SeqStack(&S);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值