宽度优先遍历,可访问位置.
记录到出发点的最近距离。
深度优先遍历不好做。
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt(), m = sc.nextInt();
char[][] grid = new char[n][m];
boolean[][] used = new boolean[n][m];
for(int i=0; i < n; i++) {
char[] chars = sc.next().toCharArray();
grid[i] = chars;
for(int j=0; j < m; j++) if(chars[j] == 'X') used[i][j] = true;
}
int sx = sc.nextInt(), sy = sc.nextInt();
int k = sc.nextInt();
int[][] dir = new int[k][2];
for(int i=0; i < k; i++) {
dir[i][0] = sc.nextInt();
dir[i][1] = sc.nextInt();
}
int[][] res = new int[n][m];
for(int i=0; i < n; i++) Arrays.fill(res[i], m*n);
int step = 0;
Queue<Integer> q = new LinkedList<>();
q.offer(sx*m+sy); res[sx][sy] = 0;
while(!q.isEmpty()) {
int size = q.size();
step++;
for(int i=0; i < size; i++) {
int cur = q.poll();
int x = cur/m, y = cur%m;
for(int j=0; j < k; j++) {
int xx = x + dir[j][0], yy = y + dir[j][1];
if(xx >= 0 && xx < n && yy >= 0 && yy < m && !used[xx][yy]) {
q.offer(xx*m+yy);
used[xx][yy] = true;
res[xx][yy] = step;
}
}
}
}
int ans = 0;
for(int i=0; i < n; i++)
for(int j=0; j < m; j++)
if(grid[i][j] == '.')
ans = Math.max(ans, res[i][j]);
if(ans == n*m)
System.out.println(-1);
else
System.out.println(ans);
}
}