清华大学版数据结构(链式栈) 迷宫问题求解C语言版

先来一张女神的图片防止定定神,防止晕码

太漂亮了

一,需求分析

1.通过识别用户输入来判断用户的操作行为。
2.要求用户自定义一个迷宫包括出入口(输入1为围墙,0为通路,迷宫最外层为一圈围墙,需要用户自己输入)。
3.迷宫若有解,则在迷宫上打印出路径,路径由 ‘*’ 组成,若是求解时走进死胡同则将死胡同用 ’@‘ 标记。

二,概要设计

1.定义栈的数据类型及基本操作。
2.定义迷宫数据类型及基本操作。
3.程序分为迷宫设计,迷宫求解,迷宫打印和路径打印四个模块。

三,详细设计

1.坐标位置类型

typedef struct//定义位置
{
   
    int r ,c;
}PosType;

2.迷宫类型

typedef struct//定义迷宫类型
{
   
    int m,n;
    char arr[RANGE][RANGE];//各个位置取   空格,#,*,@
    int flag;               //标记迷宫是否建立否为0是为1
}MazeType;
************************************************************************
int Initmaze(MazeType *maze)//建立迷宫
{
   
    int i,j;
    printf("请输入迷宫行数与列数:\n");
    scanf("%d %d",&(maze->m),&(maze->n));
    int a[maze->m][maze->n];
    maze->flag=1;           //标记迷宫已经建立
    printf("请输入迷宫(0代表通道 1代表障碍  )\n");
    for(i=0;i<maze->m;i++)                                         //开始建立迷宫
    {
   
        for(j=0;j<maze->n;j++)
        {
   
            scanf("%d",&a[i][j]);
            switch(a[i][j])
            {
   
                case 0: maze->arr[i][j]=' ';break;
                case 1: maze->arr[i][j]='#';break;
                default:return error;
            }
        }
    }
    printf("迷宫建立成功!\n");
    return 0;
}
************************************************************************
stack MazePath(MazeType *maze)  //寻找出路(求解时在当前位置依次向东,南,西,北四个方向去探索,如果可以走通就走向那个位置,并将那个位置纳入栈,如果都走不通就退回上一个位置并把此位置移出栈如果栈没有元素可移说明无路可退,迷宫无解
{
   
    PosType start,end,curpos;
    printf("请输入入口和出口坐标\n");
    scanf("%d%d%d%d",&start.r,&start.c,&end.r,&end.c);
    curpos=start;
    stack s;
    InitStack(&s);
    s.top->date.di=0;
    SElemType e;
    int step=1;
    e=CreatElem(start,0,step);
    Push(&s,e);
    s.stacksize++;
    maze->arr[start.r][start.c]='*';
    while(1)                                                       //开始寻找出路
    {
   
        if(pass(maze,curpos,1)==1)//如果东不是来向且向东能通则往东走
        {
   
            step++;                                         //计步器加加
            curpos.c++;                                      //当前位置更新
            e=CreatElem(curpos,1,step);                     //创造节点数据
            Push(&s,e);                                     //此数据入栈
            s.stacksize++;                                  //栈的元素个数加一
            maze->arr[curpos.r][curpos.c]='*';              //迷宫中此位置成为路径中的一步
            if(comp(curpos,end))                            //如果到达出口则返回
            {
   
                printf("路径已找到\n");
                return s;
            }
        }
        else if(pass(maze,curpos,2)==1)//否则如果南不是来向且向南能通则往南走
        {
   
            step++;
            curpos.r++;
            e=CreatElem(curpos,2,step);
            Push(&s,e);
            s.stacksize++;
            maze->arr[curpos.r][curpos.c]='*';
            if(comp(curpos,end))
            {
   
                printf("路径已找到\n");
                return s;
            }
        }
        else if(pass(maze,curpos,3)==1)//否则如果西不是来向且向西能通则往西走
        {
   
            step++;
            curpos.c--;
            e=CreatElem(curpos,3,step);
            Push(&s,e);
            s.stacksize++;
            maze->arr[curpos.r][curpos.c]='*';
            if(comp(curpos,end))
            {
   
                printf("路径已找到\n");
                return s;
            }
        }
        else if(pass(maze,curpos,4)==1)//否则如果北不是来向且向北能通则往北走
        {
   
            step++;
            curpos.r--;
            e=CreatElem(curpos,4,step);
            Push(&s,e);
            s.stacksize++;
            maze->arr[curpos.r][curpos.c]='*';
            if(comp(curpos,end))
            {
   
                printf("
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值