数据结构与算法实验02-DFS迷宫搜索

迷宫搜索

实验内容与要求

迷宫只有两个门,一个叫做入口,另一个叫做出口。把一只老鼠从一个无顶盖的大盒子的入口处赶进迷宫。迷宫中设置很多隔壁,对前进方向形成了多处障碍,在迷宫的唯一出口处放置了一块奶酪,吸引老鼠在迷宫中寻找通路以到达出口。求解迷宫问题,即找出从入口到出口的路径。

实验思路

  • 由于要求用栈所以可以用深搜来做
  • 先手写一个栈
  • 然后dfs结束

完整代码

//
// Created by CrazyBin on 2022/2/26.
//
#include "stdio.h"
#include "stdlib.h"
int st[1010][1010];
int g[1010][1010];
int way[1010][1010];
int top=-1;
typedef struct stack{
    int x[100010];
    int y[100010];
} sk;
sk *s;
void init(int n,int m);
void push(int x,int y);
void pop();
int empty();
int dfs(sk *s);
int queryX();
int queryY();
int n,m;
int flag=0;
int main()
{
    printf("欢迎使用小白鼠闯迷宫系统!\n");
    printf("请输入迷宫的行数和列数:");
    scanf("%d %d",&n,&m);
    init(n,m);
    printf("请输入迷宫地图:\n");
    for(int i=0;i<n;i++)
        for(int j=0;j<m;j++)
        {
            scanf("%d",&g[i][j]);
        }
    push(0,0);
    st[0][0]=1;
    dfs(s);
    if(flag==0)
    {
        printf("此迷宫不通");
    }
    else
    {
        printf("到达迷宫的通路有%d条\n",flag);
        printf("其中一条的轨迹如下所示:\n");
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<m;j++)
                if(way[i][j]==1)
                    printf("1");
                else
                    printf(" ");
            printf("\n");
        }
    }
    return 0;
}
void init(int n,int m)
{
    s=(sk*) malloc(sizeof (stack));
    for(int i=0;i<n;i++)
        for(int j=0;j<m;j++)
        {
            st[i][j]=-1;
            way[i][j]=-1;
        }
}
int dfs(sk *s)
{
   int dx[]={-1,1,0,0},dy[]={0,0,-1,1};
       for(int i=0;i<4;i++)
        {
           int x=queryX()+dx[i],y=queryY()+dy[i];
           if(x>=0&&x<n&&y>=0&&y<m&&g[x][y]==0&&st[x][y]==-1)
           {
               push(x,y);
               st[x][y]=1;
               if(st[n-1][m-1]==1)
               {
                   flag++;
                   if(flag==1) {
                       for (int i = 0; i <= top; i++) {
                           int res_x = s->x[i];
                           int res_y = s->y[i];
                           way[res_x][res_y] = 1;
                       }
                   }
               }
               dfs(s);
               st[x][y]=-1;
               pop();
           }
        }
    return 0;
}
void push(int x,int y)
{
   s->x[++top]=x;
   s->y[top]=y;
}
void pop()
{
    top--;
}
int empty()
{
   return top;
}
int queryX()
{
    return s->x[top];
}
int queryY()
{
    return s->y[top];
}


实验截图

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值