public class Main { static int N = 100; static char[][] arr = new char[N][N]; static int k = 0,n,m; static List<Integer>[] lists = new List[2]; public static void main(String[] args) { Scanner scanner = new Scanner(System.in); n = scanner.nextInt(); m = scanner.nextInt();
String s ; for (int i = 0; i < n; i++) { s = scanner.next(); for (int j = 0; j < m; j++) { arr[i][j] = s.charAt(j); } }
//使用DFS记录下标 for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { if(arr[i][j] == 'X'){ lists[k] = new ArrayList<>(); DFS(i,j); k++; } } }
//使用曼哈顿距离法计算 int min = Integer.MAX_VALUE,dis; point p1 = new point();point p2 = new point(); for (int i = 0; i < lists[0].size(); i++) { p1.x = lists[0].get(i)/1000; p1.y = lists[0].get(i)%1000; for (int j = 0; j < lists[1].size(); j++) { p2.x = lists[1].get(j)/1000; p2.y = lists[1].get(j)%1000; dis = Math.abs(p1.x-p2.x)+Math.abs(p1.y-p2.y)-1; min = Math.min(dis,min); } } System.out.println(min); }
//方向向量 static int[] dx = {0,0,1,-1}; static int[] dy = {1,-1,0,0}; static public void DFS(int x,int y){ //先将该店设置为已经标记 arr[x][y] ='.'; lists[k].add(x*1000+y); //向四周遍历 for (int i = 0; i < 4; i++) { int a = dx[i]+x; int b = dy[i]+y; if(a>=0&&b>=0&&a<n&&b<m&&arr[a][b] =='X'){ DFS(a,b); } } } }