问题描述
  学霸抢走了大家的作业,班长为了帮同学们找回作业,决定去找学霸决斗。但学霸为了不要别人打扰,住在一个城堡里,城堡外面是一个二维的格子迷宫,要进城堡必须得先通过迷宫。因为班长还有妹子要陪,磨刀不误砍柴功,他为了节约时间,从线人那里搞到了迷宫的地图,准备提前计算最短的路线。可是他现在正向妹子解释这件事情,于是就委托你帮他找一条最短的路线。
输入格式
  第一行两个整数n, m,为迷宫的长宽。
  接下来n行,每行m个数,数之间没有间隔,为0或1中的一个。0表示这个格子可以通过,1表示不可以。假设你现在已经在迷宫坐标(1,1)的地方,即左上角,迷宫的出口在(n,m)。每次移动时只能向上下左右4个方向移动到另外一个可以通过的格子里,每次移动算一步。数据保证(1,1),(n,m)可以通过。
输出格式
  第一行一个数为需要的最少步数K。
  第二行K个字符,每个字符∈{U,D,L,R},分别表示上下左右。如果有多条长度相同的最短路径,选择在此表示方法下字典序最小的一个。
样例输入
Input Sample 1:
3 3
001
100
110
Input Sample 2:
3 3
000
000
000
样例输出
Output Sample 1:
4
RDRD
Output Sample 2:
4
DDRR
数据规模和约定
有20%的数据满足:1<=n,m<=10
有50%的数据满足:1<=n,m<=50
有100%的数据满足:1<=n,m<=500。

#include <iostream>
using namespace std;
struct note {int x;int y;int f;int s;char dir;
};int main() {char a[501][501];int n, m;cin >> n >> m;for (int i = 1; i <= n; i++) {for (int j = 1; j <= m; j++) {cin >> a[i][j];}getchar();}int head = 1;int tail = 1;int book[501][501] = {0};book[1][1] = 1;int next[4][2] = {{1, 0},{0, -1},{0, 1},{-1, 0}};int tx = 1;int ty = 1;struct note que[250001];que[tail].x = 1;que[tail].y = 1;que[tail].f = 0;que[tail].s = 0;tail++;int flag = 0;while (head < tail) {for (int k = 0; k <= 3; k++) {tx = que[head].x + next[k][0];ty = que[head].y + next[k][1];if (tx < 1 || tx > n || ty < 1 || ty > m)continue;if (a[tx][ty] == '0' && book[tx][ty] == 0) {book[tx][ty] = 1;que[tail].x = tx;que[tail].y = ty;que[tail].f = head;que[tail].s = que[head].s + 1;if (k == 0) que[tail].dir = 'D';else if (k == 1) que[tail].dir = 'L';else if (k == 2) que[tail].dir = 'R';else if (k == 3) que[tail].dir = 'U';tail++;}if (tx == n && ty == m) {flag = 1;break;}}if (flag == 1) {break;}head++;}cout << que[tail - 1].s << endl;char t[250001];int temp = tail - 1;for (int i = que[tail - 1].s; i >= 1; i--) {t[i] = que[temp].dir;temp = que[temp].f;}for (int i = 1; i <= que[tail - 1].s; i++) {cout << t[i];}return 0;
}

ps:如果用深度优先搜索dfs,会超时,30分

#include <iostream>
using namespace std;
char a[501][501];
int book[501][501];
int n, m;
int min1 = 999999;
char s[250001];
char t[250001];
void dfs(int x, int y, int step) {int next[4][2] = {{1, 0},{-1, 0},{0, 1},{0, -1}};int tx, ty;if (x == n && y == m) {if (step < min1) {min1 = step;for (int i = 1; i <= min1; i++)s[i] = t[i];}return;}for (int k = 0; k <= 3; k++) {tx = x + next[k][0];ty = y + next[k][1];if (tx < 1 || ty < 1 || tx > n || ty > m)continue;if (a[tx][ty] == '0' && book[tx][ty] == 0) {book[tx][ty] = 1;if (k == 0) t[step] = 'D';if (k == 1) t[step] = 'L';if (k == 2) t[step] = 'R';if (k == 3) t[step] = 'U';dfs(tx, ty, step + 1);book[tx][ty] = 0;}}
}int main() {cin >> n >> m;for (int i = 1; i <= n; i++) {for (int j = 1; j <= m; j++) {cin >> a[i][j];}getchar();}book[1][1] = 1;dfs(1, 1, 1);cout << min1 - 1 << endl;for (int i = 1; i < min1; i++) {cout << s[i];}return 0;
}

学霸的迷宫-蓝桥杯算法提高-广搜 bfs 经典问题相关推荐

  1. [蓝桥杯][算法提高VIP]密码锁(BFS)

    题目描述 你获得了一个据说是古代玛雅人制作的箱子.你非常想打开箱子看看里面有什么东西,但是不幸的是,正如所有故事里一样,神秘的箱子出现的时候总是会挂着神秘的锁. 这个锁上面看起来有 N 个数字,它们排 ...

  2. c语言oj题1923偶数之和,问题 1923: [蓝桥杯][算法提高VIP]学霸的迷宫 (BFS)

    题目描述 学霸抢走了大家的作业,班长为了帮同学们找回作业,决定去找学霸决斗.但学霸为了不要别人打扰,住在一个城堡里,城堡外面是一个二维的格子迷宫,要进城堡必须得先通过迷宫.因为班长还有妹子要陪,磨刀不 ...

  3. [蓝桥杯][算法提高VIP]夺宝奇兵-递推+记忆化搜索

    题目描述 在一座山上,有很多很多珠宝,它们散落在山底通往山顶的每条道路上,不同道路上的珠宝的数目也各不相同.下图为一张藏宝地图: 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 " ...

  4. [蓝桥杯][算法提高VIP]夺宝奇兵-dp

    题目描述 在一座山上,有很多很多珠宝,它们散落在山底通往山顶的每条道路上,不同道路上的珠宝的数目也各不相同.下图为一张藏宝地图: 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 " ...

  5. JAVA 蓝桥杯 算法提高 阮小二买彩票

    JAVA 蓝桥杯 算法提高 阮小二买彩票 资源限制 时间限制:1.0s 内存限制:512.0MB 问题描述 在同学们的帮助下,阮小二是变的越来越懒了,连算账都不愿意自己亲自动手了,每天的工作就是坐在电 ...

  6. [蓝桥杯][算法提高VIP]阮小二买彩票

    [蓝桥杯][算法提高VIP]阮小二买彩票 题目描述 在同学们的帮助下,阮小二是变的越来越懒了, 连算账都不愿意自己亲自动手了,每天的工作就是坐在电脑前看自己的银行账户的钱是否有变多.可是一段时间观察下 ...

  7. 【蓝桥杯算法提高VIP-开灯游戏(两种超易理懂解法:暴力/位操作(切换位))(纯正C语言代码)】

    蓝桥杯算法提高VIP-开灯游戏 题目描述 有9盏灯与9个开关,编号都是1~9. 每个开关能控制若干盏灯,按下一次会改变其控制的灯的状态(亮的变成不亮,不亮变成亮的). 具体如下: 第一个开关控制第二, ...

  8. [蓝桥杯][算法提高] 填充蛋糕

    [蓝桥杯][算法提高] 填充蛋糕 编程计算涂满高为2,半径为r的圆形蛋糕表面,需要多少表面积的奶油(只要涂上表面和侧面) 读入一个数r,输出需要奶油的表面积,结果保留一位小数 样例输入 5.0 样例输 ...

  9. JAVA 蓝桥杯 算法提高 色盲的民主

    JAVA 蓝桥杯 算法提高 色盲的民主 资源限制 时间限制:1.0s 内存限制:256.0MB  色盲的民主 问题描述 n个色盲聚在一起,讨论一块布的颜色.尽管都是色盲,却盲得各不相同.每个人都有自 ...

最新文章

  1. 报错解决:InvalidArgumentError: Received a label value of 101 which is outside the valid range of [0, 101
  2. 速来围观!leetcode java实现汇总
  3. Nacos-Nacos和Eureka的对比
  4. 这2个单片机编程的思想,请你掌握。
  5. MFC串口通信串口指示灯的实现
  6. 实践2.2 内核模块编译
  7. 硬盘测试软件di,磁盘检测(Folder Size Professional)
  8. 基于javaweb+mysql数据库实现的宠物领养|流浪猫狗网站项目源代码
  9. padavan路由器server酱设备下线快速响应。
  10. 2022-03-02 组建raft集群实战及日志复制与主从切换调研
  11. 二手车交易价格预测 ——EDA 探索性数据分析
  12. 英语 1038个词根 后缀217个!
  13. HDFS 透明加密使用、Keystore和Hadoop KMS、加密区域、透明加密关键概念和架构、KMS配置
  14. 淘宝店如何加入全屏轮播图片
  15. dispatch emit broadcast
  16. php curl简单采集图片生成base64编码(并附curl函数参数说明)
  17. 【测验1 编程题】: Python基本语法元素 (第1周)
  18. 热激发延迟荧光(TADF)材料ND-AC、CND-AC、NAI-BiFA、NAI-PhBiFA
  19. [UOJ]#36. 【清华集训2014】玛里苟斯 线性基+分类讨论
  20. 网站如何注销备案主体

热门文章

  1. json数组对象和对象数组
  2. php168 的采集规则的改动
  3. 2003单网卡实现***,nat共享网络
  4. 安装ISA2004后,加入域时提示:远程过程调用失败且未运行的解决办法
  5. 恭祝月圆·家圆·团圆
  6. 完美运动框架封装函数startMove
  7. KafKa基本入门教程
  8. loadrunner两个报错Error -27492、Error -27778 互斥的问题
  9. U盘启动盘恢复为普通盘
  10. WindowsServer2003虚拟机 安装SQL2005失败 终于找到原因了