算法笔记_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十个数的全排 ...
随机推荐
- 线段树+哈希【CF580E】Kefa and Watch
线段树+哈希[CF580E]Kefa and Watch Description \(n\)个数的字符串,\(m + k\)个操作 1 l r k把\(l - r\)赋值为\(k\) 2 l r d询 ...
- 初雪-Diary?
who care ------------2018 11 6-------------- 终于AK一场啦 ------------2018 10 18-------------- 嗯....今天T2多 ...
- [BZOJ4246]两个人的星座(计算几何)
4246: 两个人的星座 Time Limit: 40 Sec Memory Limit: 256 MBSubmit: 101 Solved: 55[Submit][Status][Discuss ...
- POJ 2348 Euclid's Game 博弈论
http://poj.org/problem?id=2348 顺便说,必应翻译真的好用,比谷歌翻译好用100倍. 很难判断这道题的具体博弈类型. 有两种写法,一种是找规律,一种是推理得到关系后循环(或 ...
- BZOJ 1475 方格取数(二分图最大点权独立集)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1475 [题目大意] 给出一个n*n的方格,从中取一些不相邻的数字,使得和最大 [题解] ...
- bzoj 3540: [Usaco2014 Open]Fair Photography
3540: [Usaco2014 Open]Fair Photography Description FJ's N cows (2 <= N <= 100,000) are standin ...
- Problem H: 零起点学算法87——打印所有低于平均分的分数
#include<stdio.h> int main(){ ],b[]; while(scanf("%d",&n)!=EOF){ ; ;i<n;i++){ ...
- [原创]Java中字符串、数组、集合及JSONArray的长度属性
前言:数组没有length()这个方法,有length的属性.String有有length()这个方法. 1.String字符串 String str = "abcdefg";st ...
- 兼容IE8
由于IE8不支持HTML5,而它又是Win7的默认浏览器,我们即使讨厌它,在这几年却也拿它没办法. 最近做了个需要兼容IE8的项目,不可避免地用了HTML5+CSS3,甚至canvas和svg,做兼容 ...
- 我告诉你MSDN
https://msdn.itellyou.cn/ 微软的软件,系统,官方下载