蓝桥杯真题:迷宫

2023-11-20

目录

题目描述

运行限制

dfs:

bfs:

结果:


题目描述

本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。

下图给出了一个迷宫的平面图,其中标记为 11 的为障碍,标记为 00 的为可以通行的地方。

010000
000100
001001
110000

迷宫的入口为左上角,出口为右下角,在迷宫中,只能从一个位置走到这 个它的上、下、左、右四个方向之一。

对于上面的迷宫,从入口开始,可以按 DRRURRDDDR 的顺序通过迷宫, 一共 1010 步。其中 D、U、L、RD、U、L、R 分别表示向下、向上、向左、向右走。 对于下面这个更复杂的迷宫(3030 行 5050 列),请找出一种通过迷宫的方式,其使用的步数最少,在步数最少的前提下,请找出字典序最小的一个作为答案。

请注意在字典序中 D<L<R<UD<L<R<U。

01010101001011001001010110010110100100001000101010
00001000100000101010010000100000001001100110100101
01111011010010001000001101001011100011000000010000
01000000001010100011010000101000001010101011001011
00011111000000101000010010100010100000101100000000
11001000110101000010101100011010011010101011110111
00011011010101001001001010000001000101001110000000
10100000101000100110101010111110011000010000111010
00111000001010100001100010000001000101001100001001
11000110100001110010001001010101010101010001101000
00010000100100000101001010101110100010101010000101
11100100101001001000010000010101010100100100010100
00000010000000101011001111010001100000101010100011
10101010011100001000011000010110011110110100001000
10101010100001101010100101000010100000111011101001
10000000101100010000101100101101001011100000000100
10101001000000010100100001000100000100011110101001
00101001010101101001010100011010101101110000110101
11001010000100001100000010100101000001000111000010
00001000110000110101101000000100101001001000011101
10100101000101000000001110110010110101101010100001
00101000010000110101010000100010001001000100010101
10100001000110010001000010101001010101011111010010
00000100101000000110010100101001000001000000000010
11010000001001110111001001000011101001011011101000
00000110100010001000100000001000011101000000110011
10101000101000100010001111100010101001010000001000
10000010100101001010110000000100101010001011101000
00111100001000010000000110111000000001000000001011
10000001100111010111010001000110111010101101111000

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 256M

一道很典型的dfs或者bfs问题,迷宫问题

参考[蓝桥杯2019初赛]迷宫-DFS、BFS两种方法_lifehappy-CSDN博客_蓝桥杯迷宫

dfs:

#include <iostream>
#include <cstring>
using namespace std;
const int ax[4]={0,0,1,-1};
const int ay[4]={1,-1,0,0};
const char dir[5]={'R','L','D','U'};
int maze[60][60],mins[60][60];
char a[2000];//记录方位
int best;//记录步数
string ans;//记录a中方位路径

//判断这个点是否越界,是否走过
bool judge(int x,int y)
{
  return x>0&&x<=30&&y>0&&y<=50&&!maze[x][y];
}

void dfs(int x,int y,int pos)
{
  if(pos>best) return;//用步数剪枝
  if(x==30 && y==50)
  {
    string tmp;
    for(int i=1;i<pos;++i)
      tmp+=a[i];
    if(pos<best)
    {
      ans=tmp;
      best=pos;
    }
    else if(pos==best && tmp<ans) ans=tmp;
    return;
  }
  for(int i=0;i<4;++i)
  {
    int tempx=x+ax[i];
    int tempy=y+ay[i];
    if(judge(tempx,tempy)&&pos+1<=mins[tempx][tempy])//步数剪枝
    {
      maze[tempy][tempy]=1;
      mins[tempx][tempy]=pos+1;
      a[pos]=dir[i];
      dfs(tempx,tempy,pos+1);
      maze[tempx][tempy]=0;
    }
  }
}
int main()
{
  // 请在此输入您的代码
  memset(mins,1<<28,sizeof(mins));
  best=1<<28;
  for(int i=1;i<=30;++i)
  {
    for(int j=1;j<=50;++j)
    {
      char t;
      cin>>t;
      maze[i][j]=t-'0';
    }
  }
  maze[1][1]=1;
  dfs(1,1,1);
  cout<<ans<<endl;
  return 0;
}

bfs:

#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
const int ax[4]={1,0,0,-1};
const int ay[4]={0,-1,1,0};
const char dir[5]={'D','L','R','U'};
int maze[60][60];

struct point
{
  int x,y;
  string ans;
  point(int a,int b,string c):x(a),y(b),ans(c){}
};

//判断这个点是否越界,是否走过
bool judge(int x,int y)
{
  return x>0&&x<=30&&y>0&&y<=50&&!maze[x][y];
}

void bfs()
{
  queue<point>ans;
  ans.push(point(1,1,""));
  while(!ans.empty())
  {
    point temp=ans.front();
    ans.pop();
    if(temp.x==30&&temp.y==50)
    {
      cout<<temp.ans<<endl;
      return;
    }
    for(int i=0;i<4;++i)
    {
      int tempx=temp.x+ax[i];
      int tempy=temp.y+ay[i];
      if(judge(tempx,tempy))
      {
        maze[tempx][tempy]=1;
        ans.push(point(tempx,tempy,temp.ans+dir[i]));
      }
    }
  }
}

int main()
{
  // 请在此输入您的代码
  for(int i=1;i<=30;++i)
  {
    for(int j=1;j<=50;++j)
    {
      char t;
      cin>>t;
      maze[i][j]=t-'0';
    }
  }
  bfs();
  return 0;
}

由于是bfs,虽然可以找到最先到的,但是字典序确实难去安排,所以可能这里方向的定义顺序不同对答案也有影响,建议dfs吧。。。

结果:

由于是填空题,这样写就行了(注意字符串的双引号,我是憨憨):

cout<<"DDDDRRURRRRRRDRRRRDDDLDDRDDDDDDDDDDDDRDDRRRURRUURRDDDDRDRRRRRRDRRURRDDDRRRRUURUUUUUUULULLUUUU"
<<"RRRRUULLLUUUULLUUULUURRURRURURRRDDRRRRRDDRRDDLLLDDRRDDRDDLDDDLLDDLLLDLDDDLDDRRRRRRRRRDDDDDDRR"<<endl;

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

蓝桥杯真题:迷宫 的相关文章

  • 【瑞吉外卖day04】

    菜品管理业务 1 文件上传下载 1 1 文件上传介绍 1 2 文件下载介绍 1 3 文件上传代码实现 前端页面直接使用现成的 源码这里

随机推荐

  • Freertos代码之临界函数

    芯 片 STM32F427VITx 指 令 集 ARMV7 Thumb2 编译环境 arm gcc FreeRTOS有如下临界节管理的宏定义 define portSET INTERRUPT MASK FROM ISR ulPortRais
  • Java上传文件大小受限怎么解决

    一般控制台上会出现像这样 1048576 bytes 这大小限制 org springframework web multipart MaxUploadSizeExceededException Maximum upload size ex
  • rttread-nano 使用记录:rt_kprintf函数格式化打印无法左对齐

    rttread nano 使用记录 rt kprintf函数格式化打印无法左对齐 今天用rt kprintf函数打印输出一个表格 为了表格好看每一列我都使用格式化参数 负号符号设置为了左对齐 但是发现无法打印 也无法打印浮点数 换成微库的p
  • 使用presto调用hive

    启动hive metastore服务 hive service hivestore 关于最后的一个 告诉小白一下是后台运行的意思 presto配置使用hive插件 presto所在的文件中etc 自建 的catalog 自建 中hive p
  • 输出数组的最大值、最小值及其位置

    题目 输入一个长度为10的数组 输出数组的最大值 最小值及其最大值 最小值在数组里的位置 思路 如果只需找出最大值 我们可以假定最大值max为数组的第一个元素 然后将剩余的元素逐个和max比较 如果有比max更大的元素 就将其记录下来 直到
  • Qt HTTP POST json 访问服务器

    form格式访问服务器 QByteArray postArray postArray append grant type authorization code postArray append client id 32u2w95f200D4
  • 数据中台与数据仓库区别

    1 数据源不同 先从数据来源上来说 数据中台的数据来源可以是结构化数据或者非结构化的数据 而传统数仓的数据来源主要是业务数据库 数据格式也是以结构化数据为主 2 数据的处理不同 数据中台不仅仅是汇聚企业各种数据 而且让这些数据遵循相同的标准
  • 用户复购周期计算

    用户复购周期 两次购买之间的时间间隔 一 首先使用SQL进行计算 注 用户在一天中发生多次购买则只记为1次购买 1 根据用户id与购买日期进行分组 将一天内发生多次消费记录进行合并 DROP TABLE member Repurchase
  • Python播放GIF图片(ChatGPT代码参考)

    在网上找了好几个方法 最后还是出现各种问题 解决不了播放GIF的功能 最后 通过ChatGPT给出了简单明了的方案 使用第三方库imageio和matplotlib animation来实现 调试直接通过 但有小瑕疵 就是显示gif时隐藏掉
  • caffe源码 之 CPU与GPU数据同步类

    本文主要解析caffe源码文件 src caffe SycedMem cpp 该文件主要实现cpu与gpu的内存同步 先看SycedMem hpp中SycedMem的类定义 ifndef CAFFE SYNCEDMEM HPP define
  • 简单的连接数据库的Web登录界面

    简单的连接数据库的Web登录界面 一 需求分析 实现在登录界面输入用户名和密码 连接数据库 与数据库信息进行比对 若用户名和密码相互匹配 则显示登陆成功 若不正确 选择重新输入 二 工具 1 MySql 2 Tomcat 3 Java EE
  • spring boot 定时任务参数设置

    cron参数 分别对应 秒 分 时 日 月 年 0 0 10 14 16 每天上午10点 下午2点 4点 逗号之间连接起来算一个 0 0 12 每天中午12点触发 0 0 5 0 每5分钟执行一次 0 10 14 16 每天上午10点 下午
  • 程序删除自身

    Windows平台下删除自身的方法 通过bat文件删除 echo off loop del access exe if exist access exe goto loop del DelMe bat 用C C 语言表示创建DelMe ba
  • Python 变量与赋值

    一 变量及类型 1 变量可以是任意的数据类型 在程序中用一个变量名表示 2 变量名区分大小写 3 变量名必须是大小写英文 数字和下划线 的组合 且不能以数字开头 如 gt gt gt a 1 变量a是一个整数 gt gt gt t 007
  • 执行存储过程 获得 table 返回结果

    调用存偖过程 写入投诉信息 SqlConnection conn db GetCon 连接数据库 conn Open 并打开了连接 SqlCommand sqlcmd new SqlCommand 存偖过程名称 conn 使用存偖过程 sq
  • 如果老板要求你的系统接入春晚大流量活动,你会心慌慌吗?

    目录 回头看看 原始系统技术架构 基于CDN的活动静态页面缓存方案 基于Nginx Tomcat Redis的多级缓存方案 超高并发写请求RocketMQ削峰填谷方案 系统限流防雪崩体系架构方案 今天给大家分享一个话题 就是如果要是你老板突
  • MyBatis实现Mapper配置并查询数据

    什么是Mapper 在MyBatis工程搭建 中我们主要讲解的是 MyBatis 如何连接数据库 具体执行 SQL 语句使用的是 JDBC 方式 但在实际应用中是不会选择 JDBC 来执行 SQL 的 MyBatis 提供了 Mapper
  • MeterSphere接口测试cookie提取正则表达式

    在接口自动化测试中经常需要提取header cookie信息 MeterSphere接口自动化测试 添加cookie提取方法如下 0 开启场景共享cookie 1 选择要提取cookie的请求步骤 2 点击后置操作 3 添加参数提取 类型选
  • Vuetify笔记(3):v-btn按钮和v-text-field文本

    1 v btn按钮 在UI组件中v btn组件是用一个material design主题和多个选项来替换标准的html按钮 任何色彩辅助类都可以用来改变背景或文字的颜色 v btn按钮常用属性 1 flat 移除按钮的背景色 布尔值类型 默
  • 蓝桥杯真题:迷宫

    目录 题目描述 运行限制 dfs bfs 结果 题目描述 本题为填空题 只需要算出结果后 在代码中使用输出语句将所填结果输出即可 下图给出了一个迷宫的平面图 其中标记为 11 的为障碍 标记为 00 的为可以通行的地方 010000 000