热门标签 | HotTags
当前位置:  开发笔记 > 人工智能 > 正文

蓝桥杯练习系统试题集算法提高ADV-147学霸的迷宫

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

问题描述
  学霸抢走了大家的作业,班长为了帮同学们找回作业,决定去找学霸决斗。但学霸为了不要别人打扰,住在一个城堡里,城堡外面是一个二维的格子迷宫,要进城堡必须得先通过迷宫。因为班长还有妹子要陪,磨刀不误砍柴功,他为了节约时间,从线人那里搞到了迷宫的地图,准备提前计算最短的路线。可是他现在正向妹子解释这件事情,于是就委托你帮他找一条最短的路线。
输入格式
  第一行两个整数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求最短路,保持字典序只需要调整广搜的时候的方向优先顺序为D,L,R,U即可,然后打印路径用一个string不断的往下传,传到最后输出返回


#include 
#include
#include
#include
#include
#include

using namespace std;

struct p {
int x, y, cou; //cou用来记录走到当前位置走的步数
string str; //str用来记录路径
p() {}
p(int x, int y, string str, int cou) : x(x), y(y), str(str), cou(cou) {}
};

char mapp[510][510];
bool vis[510][510];
queue

Q;

int n, m;
//dir按照D,L,R,U的顺序
int dir[4][2] = { {1, 0}, {0, -1}, {0, 1}, {-1, 0} };

bool check(int x, int y) {
if (x <0 || x >= n || y <0 || y >= m || vis[x][y])
return false;
return true;
}

void bfs() {
p tp = p(0, 0, "", 0);

while (!Q.empty()) Q.pop(); //初始化队列
Q.push(tp);
vis[0][0] = true;

while (!Q.empty()) {
p np = Q.front(); Q.pop();
for (int i = 0; i <4; i++) {
int cx = dir[i][0], cy = dir[i][1];
int nx = np.x + cx, ny = np.y + cy;
string ts = "";
if (check(nx, ny)) {
switch(cx) {
case 1: ts = "D"; break;
case -1: ts = "U"; break;
default: break;
}
switch(cy) {
case 1: ts = "R"; break;
case -1: ts = "L"; break;
default: break;
}
if (nx == n - 1 && ny == m - 1) {
cout < cout < return ;
}
Q.push(p(nx, ny, np.str + ts, np.cou + 1));
vis[nx][ny] = true;
}
}
}
}

int main()
{
while (~scanf("%d%d", &n, &m)) {
memset(vis, false, sizeof(vis));
for (int i = 0; i scanf("%s", mapp[i]);
for (int j = 0; j if (mapp[i][j] == '1') vis[i][j] = true;
}
}
bfs();
}
return 0;
}



另外一种记录输出路径的方法:

用一个二维数组记录当前位置前一个点的位置信息,和转向信息,最后用一个栈把结果处理下输出


#include 
#include
#include
#include
#include
#include

using namespace std;

struct p {
int x, y, cou; //cou用来记录走到当前位置走的步数
p() {}
p(int x, int y, int cou) : x(x), y(y), cou(cou) {}
};

//node结构体用来保存当前点的前驱位置信息和转向
struct node {
int x, y;
char d;
node() {}
node (int x, int y, char d) : x(x), y(y), d(d) {}
}pre[510][510];

//用于最后输出路径
stack s;

char mapp[510][510];
bool vis[510][510];
queue

Q;

int n, m;
//dir按照D,L,R,U的顺序
int dir[4][2] = { {1, 0}, {0, -1}, {0, 1}, {-1, 0} };

bool check(int x, int y) {
if (x <0 || x >= n || y <0 || y >= m || vis[x][y])
return false;
return true;
}

void bfs() {
p tp = p(0, 0, 0);

while (!Q.empty()) Q.pop(); //初始化队列
while (!s.empty()) s.pop();
Q.push(tp);
vis[0][0] = true;

while (!Q.empty()) {
p np = Q.front(); Q.pop();
for (int i = 0; i <4; i++) {
int cx = dir[i][0], cy = dir[i][1];
int nx = np.x + cx, ny = np.y + cy;
char ts;
if (check(nx, ny)) {
switch(cx) {
case 1: ts = 'D'; break;
case -1: ts = 'U'; break;
default: break;
}
switch(cy) {
case 1: ts = 'R'; break;
case -1: ts = 'L'; break;
default: break;
}
if (nx == n - 1 && ny == m - 1) {
pre[nx][ny] = node(np.x, np.y, ts);

cout <
for (int tx, ty; nx != 0 || ny != 0; nx = pre[tx][ty].x, ny = pre[tx][ty].y) {
tx = nx, ty = ny;
s.push(pre[nx][ny].d);
}
while (!s.empty()) {
printf("%c", s.top());
s.pop();
}
puts("");
return ;
}
Q.push(p(nx, ny, np.cou + 1));
pre[nx][ny] = node(np.x, np.y, ts);
vis[nx][ny] = true;
}
}
}
}

int main()
{
while (~scanf("%d%d", &n, &m)) {
memset(vis, false, sizeof(vis));
for (int i = 0; i scanf("%s", mapp[i]);
for (int j = 0; j if (mapp[i][j] == '1') vis[i][j] = true;
}
}
bfs();
}
return 0;
}






推荐阅读
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • PHP 编程疑难解析与知识点汇总
    本文详细解答了 PHP 编程中的常见问题,并提供了丰富的代码示例和解决方案,帮助开发者更好地理解和应用 PHP 知识。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 技术分享:从动态网站提取站点密钥的解决方案
    本文探讨了如何从动态网站中提取站点密钥,特别是针对验证码(reCAPTCHA)的处理方法。通过结合Selenium和requests库,提供了详细的代码示例和优化建议。 ... [详细]
  • 本文详细介绍了如何解决Uploadify插件在Internet Explorer(IE)9和10版本中遇到的点击失效及JQuery运行时错误问题。通过修改相关JavaScript代码,确保上传功能在不同浏览器环境中的一致性和稳定性。 ... [详细]
  • 1.如何在运行状态查看源代码?查看函数的源代码,我们通常会使用IDE来完成。比如在PyCharm中,你可以Ctrl+鼠标点击进入函数的源代码。那如果没有IDE呢?当我们想使用一个函 ... [详细]
  • 本文详细介绍了HTML中标签的使用方法和作用。通过具体示例,解释了如何利用标签为网页中的缩写和简称提供完整解释,并探讨了其在提高可读性和搜索引擎优化方面的优势。 ... [详细]
  • 本文介绍了如何在最新版本的Visual Studio Code中配置中文语言包,使用户能够更便捷地使用中文界面。文章详细描述了安装和配置步骤,并提供了相关补充说明。 ... [详细]
  • 在哈佛大学商学院举行的Cyberposium大会上,专家们深入探讨了开源软件的崛起及其对企业市场的影响。会议指出,开源软件不仅为企业提供了新的增长机会,还促进了软件质量的提升和创新。 ... [详细]
  • 新冠肺炎疫情期间,各大银行积极利用手机银行平台,满足客户在金融与生活多方面的需求。线上服务不仅激活了防疫相关的民生场景,还推动了银行通过互联网思维进行获客、引流与经营。本文探讨了银行在找房、买菜、打卡、教育等领域的创新举措。 ... [详细]
  • 360SRC安全应急响应:从漏洞提交到修复的全过程
    本文详细介绍了360SRC平台处理一起关键安全事件的过程,涵盖从漏洞提交、验证、排查到最终修复的各个环节。通过这一案例,展示了360在安全应急响应方面的专业能力和严谨态度。 ... [详细]
  • 本章将深入探讨移动 UI 设计的核心原则,帮助开发者构建简洁、高效且用户友好的界面。通过学习设计规则和用户体验优化技巧,您将能够创建出既美观又实用的移动应用。 ... [详细]
  • 如何在PHPCMS V9中实现多站点功能并配置独立域名与动态URL
    本文介绍如何在PHPCMS V9中创建和管理多个站点,包括配置独立域名、设置动态URL,并确保各子站能够正常运行。我们将详细讲解从新建站点到最终配置路由的每一步骤。 ... [详细]
  • 本文详细解析了Python中的os和sys模块,介绍了它们的功能、常用方法及其在实际编程中的应用。 ... [详细]
author-avatar
杨静怡崇志
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有