原题链接:误落迷宫2
解题思路:
将起点,结果,三夫人的位置记录下来
bfs两次,第一次找到夫人的最短路劲,第二次是出口
注意事项:
TES都是可以走的。
参考代码:
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
/**
* @BelongsProject Demo
* @BelongsPackage bfs
* @Author lgb
* @CreateTime 2022-06-13 11:28
* @Description TODO
* @Version 1.0
* 先bfs找到 T ,在bfs找到出口
*/
public class Main {
//方向 上右下左
public static int[] fx = {0,1,0,-1};
public static int[] fy = {-1,0,1,0};
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
//大小
int n = scanner.nextInt();
int m = scanner.nextInt();
scanner.nextLine();
String[][] mg = new String[n][m];
//起点,T,E的坐标
int[] x = new int[3];
int[] y = new int[3];
for (int i=0; i<n; i++) {
String str = scanner.nextLine();
for (int j=0; j<m; j++) {
mg[i][j] = str.charAt(j) + "";
if (mg[i][j].equals("S") ) {
x[0] = j;
y[0] = i;
} else if (mg[i][j].equals("E") ) {
x[1] = j;
y[1] = i;
} else if (mg[i][j].equals("T") ) {
x[2] = j;
y[2] = i;
}
}
}
//找到三夫人的最少步数
int a = bfs(mg, x[0], y[0], x[2], y[2]);
//找到出口的最少步数
int b = bfs(mg, x[2], y[2], x[1], y[1]);
System.out.println(a+ b);
scanner.close();
}
/**
* bfs遍历
* @param mg 迷宫矩阵
* @param x 开始的横坐标
* @param y 开的的纵坐标
* @param k 结束的横坐标
* @param h 结束的纵坐标
* @return 步数
*/
public static int bfs(String[][] mg, int x, int y, int k, int h) {
//队列
Queue<int[]> queue = new LinkedList();
//标记
boolean[][] bool = new boolean[mg.length][mg[0].length];
//初始化
queue.add(new int[] {y, x} );
bool[y][x] = true;
//步数
int n = 0;
while (queue.size() != 0) {
//队列中的参数个数
int flag = queue.size();
//走一步
n++;
while (flag > 0) {
//取一个
flag--;
int[] a = queue.poll();
//上下左右4个方向进行对比如队列
for (int i=0; i<4; i++) {
int j = fx[i] + a[1];
int p = fy[i] + a[0];
if (j >=0 && j < mg[0].length && p >= 0 && p<mg.length && !bool[p][j] && !mg[p][j].equals("1")) {
//T,E也可以走
if (mg[p][j].equals("0") || mg[p][j].equals("T") || mg[p][j].equals("E")) {
queue.add(new int[] {p, j} );
bool[p][j] = true;
}
//判断结束
if (j == k && p == h) {
return n;
}
}
}
}
}
//没找到返回-1
return -1;
}
}0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复