数据结构课程设计- (二) 栈与队列(迷宫问题)

本文介绍了一种非递归方法来解决迷宫问题,通过栈结构记录路径并避免重复访问,最终输出从起点到终点的行走路线。适用于任意大小的迷宫。

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

迷宫问题求解
任务:可以输入一个任意大小的迷宫数据,用非递归的方法求出一条走出迷宫的路径,并将路径输出;
要求:在上交资料中请写明:存储结构、基本算法(可以使用程序流程图)、源程序、测试数据和结果、算法的时间复杂度、另外可以提出算法的改进方法。

利用栈实现各个方向的存储,若走到死路则退到前一格,实现寻找路径的功能:

#include <bits/stdc++.h>
using namespace std;
#define maxsize 100
typedef struct point//点
{
    int x,y,dir;//1234上下左右
}block;
typedef struct Stack//栈
{
    block b[maxsize];
    int top;
}Linkstack;
int isempty(Linkstack S)//判空
{
    if(S.top==-1)
    {
        return 1;
    }
    else
    {
        return 0;
    }
}
void inStack(Linkstack &s,block point)//进栈
{
    s.top++;
    s.b[s.top]=point;
}
block outStack(Linkstack &s)//出栈
{
    block a=s.b[s.top];
    s.top--;
    return a;
}
void Initstack(Linkstack &s)//初始化
{
    s.top=-1;
}
int solve()
{
    int i,j,dir,found=0;
    int m,n;
    printf("输入迷宫行数和列数\n");
    scanf("%d%d",&m,&n);
    int a[m][n];
    printf("输入迷宫结构,1为墙,0可走\n");
    for(i=0;i<m;i++)
    {
        for(j=0;j<n;j++)
        {
            scanf("%d",&a[i][j]);
        }
    }
    int x1,y1,x2,y2;
    printf("输入起点和终点\n");
    scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
    int jixu=1;
    if(a[x1][y1]=='1')
    {
        printf("入口选择错误");
        jixu=0;
    }
    if(a[x2][y2]=='1')
    {
        printf("出口选择错误");
        jixu=0;
    }
    Linkstack s;
    Initstack(s);
    s.top++;
    s.b[s.top].x=x1,s.b[s.top].y=y1;
    s.b[s.top].dir=0;
    a[x1][y1]=-1;//防重复
    if(jixu==1){
    while(isempty(s)!=1)
    {
        i=s.b[s.top].x,j=s.b[s.top].y;
        dir=s.b[s.top].dir;
        if(i==x2&&j==y2)//找到终点
        {
            printf("路径如下:\n");
            for(int k=0;k<=s.top;k++)//输出栈中内容
            {
                    printf("(%d,%d)",s.b[k].x,s.b[k].y);
                    int to=s.b[k].dir;
                    if(to==1)
                    {
                     printf("再向上一格\n");
                    }
                    else if(to==2)
                    {
                        printf("再向下一格\n");
                    }
                    else if(to==3)
                    {
                        printf("再向左一格\n");
                    }
                    else if(to==4)
                    {
                        printf("再向向右一格\n");
                    }
            }
            return 1;
        }
        found=0;
        dir=0;
        while(dir<=4&&found==0)
        {
            dir++;
            //printf("%d",dir);
            switch(dir)
            {
                case 1:i=(s.b[s.top].x-1);j=s.b[s.top].y;break;
                case 2:i=(s.b[s.top].x+1);j=s.b[s.top].y;break;
                case 3:i=s.b[s.top].x;j=(s.b[s.top].y-1);break;
                case 4:i=s.b[s.top].x;j=(s.b[s.top].y+1);break;
            }
            if(a[i][j]==0)//要走的方向不是墙体
            {
             found=1;
            }
        }
        if(found==1)//找到一个可以走的
        {
            s.b[s.top].dir=dir;
            block q;
            q.x=i,q.y=j;
            q.dir=dir;
            inStack(s,q);//入栈
            a[i][j]=-1;
            dir=0;
        }
        else//找不到了,该点是死路,退栈
        {
            a[s.b[s.top].x][s.b[s.top].y]=0;
            s.top--;
        }
    }}
    return 0;
}
int main()
{
    int a=solve();
    if(a==0)printf("未找到路线\n");
}

输入:
1 1 1 1 1 1
1 0 0 1 1 1
1 1 0 1 1 1
1 1 0 0 0 1
1 1 1 1 0 1
1 1 1 1 1 1

在这里插入图片描述

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值