题目链接:https://www.dotcpp.com/oj/problem1923.html

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

和一般的算出最短路径不同的是,还要记录方向,之前省赛的时候没有做出来,现在按照大佬的思路做了下(用一个字符串存方向,每次放一个字母),但是只过了83%的样例,歇会儿再改改(第一个是错误版本,第二个是正确版本)

 #include <iostream>
#include <algorithm>
#include <string>
#include <cstring>
#include <queue>
#include <stack>
using namespace std;
const int INF=0x3f3f3f3f;
typedef pair<int,int> P;
int N,M;
int d[][];
char a[][];
int dx[]={,,,-};
int dy[]={,-,,};
char pos[]={'D','L','R','U'};
int sx,sy,gx,gy;
int x,y,nx,ny;
void bfs()
{
memset(d,INF,sizeof(d));
sx=,sy=,gx=N-,gy=M-;
string s="";
queue<P> que;
que.push(P(sx,sy));
d[sx][sy]=;
while(!que.empty()){
P p=que.front();
que.pop();
x=p.first,y=p.second;
if(x==gx&&y==gy) break;
for(int i=;i<;i++){
nx=x+dx[i],ny=y+dy[i];
if(nx>=&&nx<N&&ny>=&&ny<M&&a[nx][ny]!=''&&d[nx][ny]==INF){
s+=pos[i];
que.push(P(nx,ny));
d[nx][ny]=d[x][y]+;
}
}
}
cout<<d[gx][gy]<<endl;
cout<<s<<endl;
}
int main()
{
while(cin>>N>>M){
for(int i=;i<N;i++){
for(int j=;j<M;j++){
cin>>a[i][j];
}
}
bfs();
}
return ;
}

对比了下过了的大佬的代码,自己又改了改,过了。。。区别在于需要给每个结点一个字符串记录路径方向,而不是只用一个字符串记录。。。

 #include <iostream>
#include <algorithm>
#include <string>
#include <cstring>
#include <queue>
#include <stack>
using namespace std;
const int INF=0x3f3f3f3f;
struct node
{
int first,second;
string s;
};
int N,M;
int d[][];
char a[][];
int dx[]={,,,-};
int dy[]={,-,,};
char pos[]={'D','L','R','U'};
int sx,sy,gx,gy;
int x,y,nx,ny;
void bfs()
{
memset(d,INF,sizeof(d));
sx=,sy=,gx=N-,gy=M-;
queue<node> que;
node p;
p.first=sx,p.second=sy,p.s="";
que.push(p);
d[p.first][p.second]=;
node k,l;
while(!que.empty()){
k=que.front();
que.pop();
x=k.first,y=k.second;
if(x==gx&&y==gy) break;
for(int i=;i<;i++){
nx=x+dx[i],ny=y+dy[i];
if(nx>=&&nx<N&&ny>=&&ny<M&&a[nx][ny]!=''&&d[nx][ny]==INF){
l.first=nx,l.second=ny,l.s=k.s+pos[i];
que.push(l);
d[nx][ny]=d[x][y]+;
}
}
}
cout<<d[gx][gy]<<endl;
cout<<k.s<<endl;
}
int main()
{
while(cin>>N>>M){
for(int i=;i<N;i++){
for(int j=;j<M;j++){
cin>>a[i][j];
}
}
bfs();
}
return ;
}

问题 1923: [蓝桥杯][算法提高VIP]学霸的迷宫 (BFS)的更多相关文章

  1. 问题 1936: [蓝桥杯][算法提高VIP]最大乘积

    问题 1936: [蓝桥杯][算法提高VIP]最大乘积 时间限制: 1Sec 内存限制: 128MB 提交: 77 解决: 16 题目描述 对于n个数,从中取出m个数,如何取使得这m个数的乘积最大呢? ...

  2. Java实现 蓝桥杯 算法提高VIP Substrings(暴力)

    试题 算法提高 Substrings 问题描述 You are given a number of case-sensitive strings of alphabetic characters, f ...

  3. Java实现 蓝桥杯 算法提高VIP 摆花 dp 记忆搜索 2种做法 多重背包

    题目描述 小明的花店新开张,为了吸引顾客,他想在花店的门口摆上一排花,共m盆.通过调查顾客的喜好,小明列出了顾客最喜欢的n种花,从1到n标号.为了在门口展出更多种花,规定第i种花不能超过ai盆,摆花时 ...

  4. 蓝桥杯 算法提高 11-1实现strcmp函数 (JAVA方法)

    蓝桥杯 算法提高 11-1实现strcmp函数 (JAVA方法) 首先这不是一个多难的题,但是网上的我没怎么找到有Java的代码,基本全都是c语言的,小编是个小白,如果有不对的地方请联系小编 问题描述 ...

  5. 蓝桥杯 算法提高 学霸的迷宫 经典BFS问题

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

  6. Java实现 蓝桥杯 算法提高 学霸的迷宫

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

  7. Java实现 蓝桥杯 算法提高 进攻策略加强(暴力)

    试题 算法提高 进攻策略加强 问题描述 植物大战僵尸这款游戏中,还有一个特别的玩儿法:玩家操纵僵尸进攻植物. 首先,僵尸有m种(每种僵尸都是无限多的),玩家可以选择合适的僵尸来进攻.使用第i种僵尸需要 ...

  8. Java实现 蓝桥杯 算法提高 小X的购物计划

    试题 算法提高 小X的购物计划 问题描述 小X打算去超市shopping.小X没什么钱,只有N元.超市里有M种物品,每种物品都需要money,在小X心中有一个重要度.有的物品有无限件,有的物品只有几件 ...

  9. 蓝桥杯算法提高 P1001(大数乘法)

      算法提高 P1001   时间限制:1.0s   内存限制:256.0MB   当两个比较大的整数相乘时,可能会出现数据溢出的情形.为避免溢出,可以采用字符串的方法来实现两个大数之间的乘法. 具体 ...

随机推荐

  1. Spring Boot 引入org.springframework.boot.SpringApplication出错

    今天新建的一个spring boot maven项目, 写启动类时发现无法引入SpringApplication, 经查原来是冲突了,我早些时候用了比较低版本的spring boot创建了项目 ,导致 ...

  2. servlet 拦截器 (filter)

    使用: 创建一个类实现javax.servlet.Filter接口,并重写接口中所有的方法: 在web.xml配置所需要拦截的请求. 过程说明: 1>在应用启动的时候就进行装载Filter类(与 ...

  3. CSP201312-4 有趣的数【dp】

    问题描述 试题编号: 201312-4 试题名称: 有趣的数 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 我们把一个数称为有趣的,当且仅当: 1. 它的数字只包含0, 1, ...

  4. 数学和物理太难?这些 GIF 让你秒懂抽象概念

    把科学带回家,给孩子最好的科学教育 觉得数学和物理很抽象很难懂吗?今天我们来分享一组数学和物理相关的动图,让你秒懂抽象概念. 数学动图 △ 从椭圆的一个焦点射出的光线总会通过另一个焦点. △ 真人版. ...

  5. Js中Map对象的使用

    Js中Map对象的使用 1.定义 键/值对的集合. 2.语法 mapObj = new Map() 3.备注 集合中的键和值可以是任何类型.如果使用现有密钥向集合添加值,则新值会替换旧值. 4.属性 ...

  6. 腾讯云CDB回档失败浅析

    Ⅰ.先看问题 先简单介绍下cdb的回档功能,回档分为极速.快速.普通,分别对应指定表.指定库.整个实例回档. 控制台报错回档任务执行失败 提示信息:rollback table failed:SQL ...

  7. Centos7安装并配置mysql5.6

    1.下载安装包:https://pan.baidu.com/s/18xAumOggjm9bu9Wty6kYjg 2.卸载系统自带的Mariadb 2.1查询已安装的mariadb [root@loca ...

  8. 手动实现一个list的常用功能

    package com.pcxm.list; /** * 手动实现一个list * MyList * @description TODO * @author zhoum * @date 2018年5月 ...

  9. tensorflow 基本内容

    tensorflow的结构 1.使用图(graphs)来表示计算任务 2.在被称之为会话(Session)的上下文(context)中执行图 3.使用tensor表示数据 4.通过变量(Variabl ...

  10. HDU 2544最短路 【dijkstra 链式前向星+优先队列优化】

    最开始学最短路的时候只会用map二维数组存图,那个时候还不知道这就是矩阵存图,也不懂得效率怎么样 经过几个月的历练再回头看最短路的题, 发现图可以用链式前向星来存, 链式前向星的效率是比较高的.对于查 ...