【期末算法课程设计十道题】-【BFS】-【9-迷宫求解问题】

大家好,我是被白菜拱的猪。

一个热爱学习废寝忘食头悬梁锥刺股,痴迷于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;
	}

}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值