import java.util.*;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static List<String> map = new ArrayList<>();
public static List<List<Boolean>> vis = new ArrayList<>();
static int n, m;
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 注意 hasNext 和 hasNextLine 的区别
n = in.nextInt();
m = in.nextInt();
int ox, oy, ex, ey;
ox = in.nextInt() - 1;
oy = in.nextInt() - 1;
ex = in.nextInt() - 1;
ey = in.nextInt() - 1;
for (int i = 0; i < n; ++i) {
String t = in.next();
map.add(t);
vis.add(new ArrayList(Collections.nCopies(m, false)));
}
System.out.println(bfs(ox, oy, ex, ey));
}
static class point {
public int x, y;
public point(int x, int y) {
this.x = x;
this.y = y;
}
}
static int dx[] = {0, 0, 1, -1};
static int dy[] = {1, -1, 0, 0};
public static int bfs(int ox, int oy, int ex, int ey) {
int res = 0;
Deque<point> q = new ArrayDeque();
q.add(new point(ox, oy));
vis.get(ox).set(oy, true);
while (!q.isEmpty()) {
int size = q.size();
for (int j = 0; j < size; j++) { //区别于洪水模型,多加了一层for以便记录深度;
point p = q.pollFirst();
if (p.x == ex && p.y == ey)return res;
for (int i = 0; i < 4; ++i) {
int tx = p.x + dx[i];
int ty = p.y + dy[i];
if (tx >= 0 && tx < n && ty >= 0 && ty < m) {
if (map.get(tx).charAt(ty) == '.') {
if (!vis.get(tx).get(ty)) {
vis.get(tx).set(ty, true);
q.addLast(new point(tx, ty));
//res++; //洪水模型会放在这里,但是会导致记录下所有走过的路,死路也记
}
}
}
}
}
res++;//每层加一
}
return -1;
}
}
Java写得略显麻烦,可能是ArrayList的创建和get与cpp的vector不太通导致的,多繁琐一点

京公网安备 11010502036488号