经典BFS-走迷宫
一、问题分析#
原题链接:https://www.acwing.com/problem/content/846/
宽搜的优势:可以搜到最短路
记录每一个能走的位置对于起点的距离,这样可以很容易计算到达终点的最短路。(针对所有边权重都是一样的题)
二、代码实现#
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
// 宽搜需要使用队列,定义一个适合该题的类,作为队列的泛型。
class Node {
int x;
int y;
public Node(int x, int y) {
this.x = x;
this.y = y;
}
}
public class Main {
static int N = 110;
static int n;
static int m;
// 保存地图情况
static int[][] g = new int[N][N];
// 保存每一步对于初始位置的距离
static int[][] path = new int[N][N];
// 因为要计算对于当前位置的四周位置,不使用多个if,使用偏移量
static int[] xx = { 1, 0, -1, 0 };
static int[] yy = { 0, -1, 0, 1 };
static void bfs() {
// 维护队列,用于保存路径
// 队列要频繁地操作队头队尾,用LinkedList效率更高。
Queue<Node> queue = new LinkedList<>();
// 将起点添加进队列
queue.offer(new Node(0, 0));
while (!queue.isEmpty()) {
Node node = queue.poll();
// 到达边界
if (node.x == n - 1 && node.y == m - 1) {
break;
}
// 找路,四个方向
for (int i = 0; i < 4; i++) {
int newx = node.x + xx[i];
int newy = node.y + yy[i];
// 要先判断新位置是否超出边界,再判断新位置是否能走和是否走过(顺序反过来可能会出现数组越界)
if (newx >= 0 && newx < n && newy >= 0 && newy < m && g[newx][newy] == 0 && path[newx][newy] == 0) {
// 将新位置添加进队列
queue.offer(new Node(newx, newy));
// 新位置比原位置离出发位置的距离 +1
path[newx][newy] = path[node.x][node.y] + 1;
}
}
}
System.out.println(path[n - 1][m - 1]);
}
public static void main(String[] args) {
Scanner read = new Scanner(System.in);
n = read.nextInt();
m = read.nextInt();
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
g[i][j] = read.nextInt();
}
}
bfs();
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App