题目描述
边的权值为1
BFS
样例
import java.util.*;
public class Main {
static class Pair {
int first, second;
Pair(int first, int second) {
this.first = first;
this.second = second;
}
}
static final int N = 110;
static int n, m;
//存放迷宫
static int[][] g = new int[N][N];
//存放该点到起点的距离
static int[][] d = new int[N][N];
static int bfs() {
//q.add()和q.offer()都是添加新元素 q.element()和q.peek()返回第一个元素
//q.poll()返回第一个元素,并在队列中删除 q.remove()删除队列中第一个元素
Queue<Pair> q = new LinkedList<>();
//距离数组初始化为-1
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
d[i][j] = -1;
}
}
//第一个点(起点)到起点的距离为0
d[0][0] = 0;
//把第一个点(起点)放入队列
q.add(new Pair(0, 0));
//dx和dy代表偏移量数组 用来枚举上下右左四个方向
int[] dx = {-1, 0, 1, 0};
int[] dy = {0, 1, 0, -1};
while (!q.isEmpty()) {
//拿到队首元素
Pair t = q.poll();
//枚举上下右左个方向
for (int i = 0; i < 4; i++) {
int x = t.first + dx[i];
int y = t.second + dy[i];
//x和y不越界,并且g[0][0]==0(也就是这个点能走),而且这个点直接是没走过的
if (x >= 0 && x < n && y >= 0 && y < m && g[x][y] == 0 && d[x][y] == -1) {
//当前这个点等于队首元素到起点的距离+1
d[x][y] = d[t.first][t.second] + 1;
//扩大队首
q.add(new Pair(x, y));//q.offer(new Pair(x, y));
}
}
}
//返回距离数组最后一个
return d[n - 1][m - 1];
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
n = scanner.nextInt();
m = scanner.nextInt();
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
g[i][j] = scanner.nextInt();
}
}
System.out.println(bfs());
}
}