问题描述
  学霸抢走了大家的作业,班长为了帮同学们找回作业,决定去找学霸决斗。但学霸为了不要别人打扰,住在一个城堡里,城堡外面是一个二维的格子迷宫,要进城堡必须得先通过迷宫。因为班长还有妹子要陪,磨刀不误砍柴功,他为了节约时间,从线人那里搞到了迷宫的地图,准备提前计算最短的路线。可是他现在正向妹子解释这件事情,于是就委托你帮他找一条最短的路线。
输入格式
  第一行两个整数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。

分析:用广度优先搜索解决。bfs。100分。

#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;
}

蓝桥杯 ADV-147 算法提高 学霸的迷宫相关推荐

  1. 【蓝桥杯】 算法提高 学霸的迷宫(深度优先搜索、BFS)

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

  2. 算法提高 学霸的迷宫

    算法提高 学霸的迷宫 时间限制:1.0s 内存限制:256.0MB 问题描述 学霸抢走了大家的作业,班长为了帮同学们找回作业,决定去找学霸决斗.但学霸为了不要别人打扰,住在一个城堡里,城堡外面是一个二 ...

  3. [蓝桥杯]测试题 E 算法提高 我们的征途是星辰大海 题解和C++示例代码

    E 算法提高 我们的征途是星辰大海 时间限制:1.0s   内存限制:256.0MB 最新的火星探测机器人curiosity被困在了一个二维迷宫里,迷宫由一个个方格组成. 共有四种方格: '.' 代表 ...

  4. 蓝桥杯题库 算法提高非vip部分(C++、Java)代码实现(251-280)

    文章目录 ADV-251 Petri Net Simulation cpp: java: ADV-252 Navigation cpp: ADV-256 The Sky is the Limit cp ...

  5. [Java] 蓝桥杯ADV-147 算法提高 学霸的迷宫

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

  6. 【蓝桥杯练习】算法提高 贪吃的大嘴

    问题描述 给定N个物品,每个物品有一个重量W和一个价值V.你有一个能装M重量的背包.问怎么装使得所装价值最大.每个物品只有一个. 输入格式 输入的第一行包含两个整数n, m,分别表示物品的个数和背包能 ...

  7. 试题集—— 算法提高 学霸的迷宫

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

  8. 【预览】蓝桥杯竞赛python算法笔记 代码模板|吐血总结|蓝桥杯省赛国赛

    [预览]蓝桥杯竞赛python算法笔记 代码模板|吐血总结 完整版链接 文章目录 [预览]蓝桥杯竞赛python算法笔记 代码模板|吐血总结 1 二分算法求分界值 2 双指针算法 2.1 求最长的不包 ...

  9. 蓝桥杯:试题 算法训练 Remember the A La Mode

    蓝桥杯:试题 算法训练 Remember the A La Mode 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 Hugh Samston经营着一个为今年的ICPC世界总决赛的参 ...

最新文章

  1. Android安全加密:消息摘要Message Digest
  2. python含金量最高的考试_中国最难的五大考试,第二个含金量最高,考过年薪30万起!...
  3. dhl:使用return RedirectToAction()和 return view()
  4. .NET Core微服务之路:让我们对上一个Demo通讯进行修改,完成RPC通讯
  5. Django后端编辑图片提取主要颜色API
  6. 删除python类中所有未使用的方法?
  7. mysql面向对象例子_PHP 面向对象实例:获取数据库用户数据
  8. mysql输入正确,但远程连接报错
  9. Node.js 切近实战(七) 之Excel在线(文件文件组)
  10. 三角函数的正交性为什么要用积分表示
  11. 网络_简单实现远程唤醒与远程控制(Teamviewer)
  12. Multisim12\Multisim14访问主数据库失败的解决方法
  13. 北京林业大学matlab公选课,北京林业大学公选课要求及分类.doc
  14. Flutter 基础UI功能,常用结构框架代码
  15. Java--SpringBoot无法访问网站
  16. 宝塔一键安装php,宝塔管理面板一键安装Tipask3.5版本教程
  17. FastStone.MaxView.2.keygen-REPT
  18. Python中: unsupported format character ''' (0x27)
  19. 使用安卓模拟器和GPA截帧分析手游
  20. linux androidx86双系统,实用教程:PC实现Windows/原生安卓双系统

热门文章

  1. Java学习系列(十一)Java面向对象之I/O流(下)
  2. 算法列表-java实现
  3. ios与android设备即时语音互通的录音格式预研说明
  4. Java反射机制获取系统@Hide属性
  5. 应用程序委托和新的单例(译)
  6. 《淘宝网开店 拍摄 修图 设计 装修 实战150招》一一1.15 如何掌握拍摄方向
  7. fopen 參数具体解释
  8. 整理LVS架构压力测试工作
  9. Tapioca:linux上同gtalk语音通信
  10. CVE-2020-15999:Chrome FreeType 字体库堆溢出原理分析