大家好,我是被白菜拱的猪。
一个热爱学习废寝忘食头悬梁锥刺股,痴迷于girl的潇洒从容淡然coding handsome boy!
Time goes quickly!啊!没想到大二就这么稀里糊涂的过去,由于疫情原因,终究是没有开学,一学期啥也没听的我,最后还要做这个期末算法设计,不做不行啊,这日后可咋整啊,屁都不会,哪家公司要你。
只要功夫深,铁杵磨成绣花针。十道算法题,在没有听一节课的情况下,通过自学在查查百度看看能做出多少,在这里记录一下,奥利给!!!
第九题
有道题目翻译
Behemoth是游戏怪物猎人世界的boss,当他快死的时候,他会召唤一块石头砸向地面。在这个时候,你必须转移到安全的地方才能生存。
假设映射是一个N乘以N的矩阵,你只有K秒移动,你每秒移动1步,向上,向下,左右4个方向,例如,如果你在(1,1),你移动到(0,1)(2,1)(1,0)(1,2)你能在几秒钟内到达正确的地方吗?
其实我已经琢磨清楚了,出题人就是根据那些经典的算法然后改编一下,其本质是没有变了。
下面老规矩,根据提示
先搜一搜什么是BFS,然后BFS的经典题目,然后我就找到了迷宫求解问题与其相似,然后b站上先学一学,附上链接
BFS求解走迷宫(讲的很清楚)
这里面使用了数据结构-队列,主要是记录哪些走过,哪些没有走过
真没想到,自己竟然独自的做出来了,这道题好坑啊,给的输入例子是010,你还得把这些数字拆分出来在存到数组里面。
好了,NO 代码 you say 个 jb!
/**
*
*/
package com.java.algorithm;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
/**
* @ClassName: Demo9
* @Description: TODO(这里用一句话描述这个类的作用)
* @author Lily
* @date 2020年6月17日
*/
public class Demo9 {
public static void main(String[] args) {
// 输入,行,时间
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
int seconds = scan.nextInt();
// 输入地图,0代表可以走,1代表起始点,2代表终点,3是障碍
int startX = 0, startY = 0, endX = 0, endY = 0;
int[][] map = new int[n][n];
for (int i = 0; i < n; i++) {
String str=scan.next();
for (int j = 0; j < n; j++) {
map[i][j] = Integer.parseInt(str.substring(j,j+1));
// 确定起点坐标
if (map[i][j] == 1) {
startX = i;
startY = j;
}
// 确定终点坐标
if (map[i][j] == 2) {
endX = i;
endY = j;
}
}
}
//到达终点的步长,每步一秒,然后与所给时间进行比较
int step=new Demo9().BFS(map, startX, startY, endX, endY);
if(step>0 && seconds>=step){
System.out.println("Yes");
}else{
System.out.println("No");
}
}
/**
* 创建一个点
*/
class Point {
int x;// 坐标x
int y;// 坐标y
int step;// 距离起始点的距离
Point(int x, int y, int step) {
this.x = x;
this.y = y;
this.step = step;
}
}
public int BFS(int[][] array, int startX, int startY, int endX, int endY) {
// 用来记录点的访问状态 1代表已经访问
int visit[][] = new int[array.length][array.length];
// 四个方向(右,下,左,上)
int dx[] = { 0, 1, 0, -1 };
int dy[] = { 1, 0, -1, 0 };
// 创建一个队列
Queue<Point> queue = new LinkedList<Point>();
;
// 创建起始点并初始化
Point start = new Point(startX, startY, 0);
visit[start.x][start.y] = 1;
// 将起点入队
queue.offer(start);
while (!queue.isEmpty()) {
int x = queue.peek().x;
int y = queue.peek().y;
// 假如是终点坐标
if (x == endX && y == endY) {
// 返回他的步数
return queue.peek().step;
}
// 没有到达终点,四个方向进行试探
for (int k = 0; k <= 3; k++) {
// 拓展的点
int tx, ty;
tx = x + dx[k];
ty = y + dy[k];
// 假如可以走,并且没有越界
if (tx < array.length && ty < array.length && tx >= 0 && ty >= 0) {
if (array[tx][ty] != 3 && visit[tx][ty] != 1) {
Point temp = new Point(tx, ty, queue.peek().step + 1);
// 将该点入队
queue.offer(temp);
visit[tx][ty] = 1;
}
}
}
// 将第一个元素出队
queue.poll();
}
return -1;
}
}