算法笔记_107:蓝桥杯练习 算法提高 学霸的迷宫(Java)
目录
1 问题描述
接下来n行,每行m个数,数之间没有间隔,为0或1中的一个。0表示这个格子可以通过,1表示不可以。假设你现在已经在迷宫坐标(1,1)的地方,即左上角,迷宫的出口在(n,m)。每次移动时只能向上下左右4个方向移动到另外一个可以通过的格子里,每次移动算一步。数据保证(1,1),(n,m)可以通过。
第二行K个字符,每个字符∈{U,D,L,R},分别表示上下左右。如果有多条长度相同的最短路径,选择在此表示方法下字典序最小的一个。
3 3
001
100
110
Input Sample 2:
3 3
000
000
000
4
RDRD
Output Sample 2:
4
DDRR
有50%的数据满足:1<=n,m<=50
有100%的数据满足:1<=n,m<=500。
2 解决方案
此题主要考查bfs遍历的具体应用。
具体思想可以参考代码注释哦。

具体代码如下:
import java.util.ArrayList;
import java.util.Scanner; public class Main { public final static int[][] move = {{-1, 0},{1,0},{0,-1},{0,1}};//分别表示向上、下、左、右移动一步
public final static String[] onePath = {"U","D","L","R"};//分别表示向上、下、左、右行走 static class point { //内部类,用于表示当前行走到达点信息
public int x; //当前到达位置横坐标
public int y; //当前到达位置纵坐标
public int step; //行走到当前顶点所用总步数
public String path; //行走到当前顶点的具体路径 point(int x, int y, int step, String path) {
this.x = x;
this.y = y;
this.step = step;
this.path = path;
}
} //判断当前位置是否是可行走的位置,如不能返回false,否则返回true
public boolean check(int[][] matrix, point a) {
int n = matrix.length - 1, m = matrix[0].length - 1;
if(a.x < 1 || a.x > n || a.y < 1 || a.y > m || matrix[a.x][a.y] == 1)
return false;
return true;
} //依据字典序{D,L,R,U},比较字符串A和B的大小,如果A > B返回true,否则返回false(PS:两者字符个数相同)
public boolean judge(String A, String B) {
char[] arrayA = A.toCharArray();
char[] arrayB = B.toCharArray();
for(int i = 0, len = A.length();i < len;i++) {
if(arrayA[i] < arrayB[i])
return false;
}
return true;
}
//把输入数据,变换为矩阵
public int[][] getMatrix(String[] A, int m) {
int[][] matrix = new int[A.length + 1][m + 1];
for(int i = 0;i < A.length;i++) {
char[] arrayA = A[i].toCharArray();
for(int j = 0;j < m;j++)
matrix[i + 1][j + 1] = arrayA[j] - '0';
}
return matrix;
} public void bfs(String[] A, int m) {
int[][] matrix = getMatrix(A, m);
ArrayList<point> list = new ArrayList<point>();
list.add(new point(1,1,0,"")); //表示从顶点(1,1)出发
int minStep = Integer.MAX_VALUE; //用于记录到达最终顶点所需最少步数
String minPath = ""; //用于记录到达最终顶点路径的最小字典序序列
while(list.size() != 0) {
point begin = list.get(0); //获取链表第一个顶点,开始进行bfs遍历
list.remove(0); //删除进行遍历的起始点 if(begin.x == matrix.length - 1 && begin.y == matrix[0].length - 1) { //当该顶点为终点时
if(minStep > begin.step) {
minStep = begin.step;
minPath = begin.path;
} else if(minStep == begin.step) {
if(judge(minPath, begin.path)) //当minPath字典序大于begin.step时
minPath = begin.path;
}
continue; //此处已经是终点,不需要进行下面bfs遍历
} for(int i = 0;i < 4;i++) { //如果未达到最终顶点(n, m),进行bfs遍历(分别向上、下、左、右移动)
int x = begin.x + move[i][0];
int y = begin.y + move[i][1];
int step = begin.step + 1;
String path = begin.path + onePath[i] ;
point temp = new point(x, y, step, path);
if(check(matrix, temp)) { //当顶点temp是可到达的顶点时
list.add(temp);
matrix[x][y] = 1; //到达该顶点后,标记该顶点不可到达,此处奥秘是大大减少了检索次数(如果换成其父母顶点不可到达,则会运行超时)
}
}
}
//输出最终结果
System.out.println(minStep+"\n"+minPath);
return;
} public static void main(String[] args) {
Main test = new Main();
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int m = in.nextInt();
in.nextLine(); //此处特别注意,输入完整数,下面接着输出字符串,此处处理换行操作
String[] A = new String[n];
for(int i = 0;i < n;i++)
A[i] = in.nextLine();
test.bfs(A, m);
}
}
参考资料:
2.蓝桥杯练习系统试题集 算法提高 ADV-147 学霸的迷宫
算法笔记_107:蓝桥杯练习 算法提高 学霸的迷宫(Java)的更多相关文章
- 算法笔记_096:蓝桥杯练习 算法提高 求最大值(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 给n个有序整数对ai bi,你需要选择一些整数对 使得所有你选定的数的ai+bi的和最大.并且要求你选定的数对的ai之和非负,bi之和非负 ...
- 算法笔记_091:蓝桥杯练习 递推求值(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 已知递推公式: F(n, 1)=F(n-1, 2) + 2F(n-3, 1) + 5, F(n, 2)=F(n-1, 1) + 3F(n- ...
- 算法笔记_056:蓝桥杯练习 未名湖边的烦恼(Java)
目录 1 问题描述 2 解决方案 2.1 递归法 2.2 递推法 1 问题描述 问题描述 每年冬天,北大未名湖上都是滑冰的好地方.北大体育组准备了许多冰鞋,可是人太多了,每天下午收工后,常常一双冰 ...
- 算法笔记_055:蓝桥杯练习 Tricky and Clever Password (Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 在年轻的时候,我们故事中的英雄——国王 Copa——他的私人数据并不是完全安全地隐蔽.对他来说是,这不可接受的.因此,他发明了一种密码,好 ...
- 算法笔记_067:蓝桥杯练习 算法训练 安慰奶牛(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 Farmer John变得非常懒,他不想再继续维护供奶牛之间供通行的道路.道路被用来连接N个牧场,牧场被连续地编号为1到N.每一个牧场都是 ...
- 算法笔记_081:蓝桥杯练习 算法提高 矩阵乘法(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 有n个矩阵,大小分别为a0*a1, a1*a2, a2*a3, ..., a[n-1]*a[n],现要将它们依次相乘,只能使用结合率,求最 ...
- 算法笔记_106:蓝桥杯练习 算法提高 周期字串(Java)
目录 1 问题描述 2 解决方案 2.1 第一印象解法(80分) 2.2 借鉴网友解法(100分) 1 问题描述 问题描述 右右喜欢听故事,但是右右的妈妈总是讲一些“从前有座山,山里有座庙,庙里有 ...
- 算法笔记_102:蓝桥杯练习 算法提高 快乐司机(Java)
目录 1问题描述 2 解决方案 1 问题描述 问题描述 "嘟嘟嘟嘟嘟嘟 喇叭响 我是汽车小司机 我是小司机 我为祖国运输忙 运输忙" 这是儿歌“快乐的小司机”.话说现在当司机光 ...
- 算法笔记_099:蓝桥杯练习 算法提高 排列数(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 0.1.2三个数字的全排列有六种,按照字母序排列如下: 012.021.102.120.201.210 输入一个数n 求0~9十个数的全排 ...
随机推荐
- 基于SAAJ的客户端
概述 SAAJ - SOAP with Attachments API for JAVA 结构图如下: 正文 1. 如何获取soap请求的关键参数 关键的参数有四个: xmlns - xml命名空间如 ...
- 51nod 1201 (dp)
整数划分 将N分为若干个不同整数的和,有多少种不同的划分方式,例如:n = 6,{6} {1,5} {2,4} {1,2,3},共4种.由于数据较大,输出Mod 10^9 + 7的结果即可. In ...
- CentOS中Ctrl+Z、Ctrl+C、Ctrl+D的区别
Ctrl+C和Ctrl+Z都是中断命令,但作用不同. Ctrl+C是发送SIGINT信号,终止一个进程. Ctrl+Z是发送SIGSTOP信号,挂起一个进程,将作业放置到后台(暂停状态).与此同时,可 ...
- Python开发基础-Day17面向对象编程介绍、类和对象
面向对象变成介绍 面向过程编程 核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西.主要应用在一旦完成很少修改的地方,如linux ...
- python的reduce()函数(转)
reduce()函数也是Python内置的一个高阶函数. reduce()函数接收的参数和 map()类似,一个函数 f,一个list,但行为和 map()不同,reduce()传入的函数 f 必须接 ...
- ElasticSearch Mapping中的字段类型
1)string: 默认会被分词 2)数字类型主要如下几种: long:64位存储 integer:32位存储 short:16位存储 byte:8位存储 double:64位双精度存储 f ...
- 【计算几何】【分类讨论】Gym - 101243I - Land Division
题意:给你一个n个点的凸包,让你切一刀,使得它变成一个m边形和一个K边形,问你切的这一刀最短是多少. 如果m+K==n+4,那么一定切在两条边上,但是由于两个线段间的最短距离,至少会经过一条线段的一个 ...
- 【DFS】Gym - 100781A - Adjoin the Networks
给你一个森林,让你把它连接成一颗树,使得直径最小. 就求出每颗树的重心以后,全都往直径最大的那个的重心上连,一般情况是最大/2+次大/2+1,次大/2+第三大/2+2 中取较大者. 还有些特殊情况要特 ...
- 【组合数】【乘法逆元】 Codeforces Round #404 (Div. 2) D. Anton and School - 2
http://codeforces.com/blog/entry/50996 官方题解讲得很明白,在这里我复述一下. 枚举每个左括号,考虑计算一定包含其的简单括号序列的个数,只考虑其及其左侧的左括号, ...
- windows和linux下杀死Tomcat进程,解决端口占用
windows和linux下解决Tomcat进程 windows下启动Tomcat报错,8080端口号被占用,报错信息如下 两种解决方法,一种是关闭了这个端口号,另外一种是修改Tomcat下的serv ...