結果
問題 |
No.157 2つの空洞
|
ユーザー |
![]() |
提出日時 | 2016-01-20 10:35:13 |
言語 | Java (openjdk 23) |
結果 |
AC
|
実行時間 | 49 ms / 2,000 ms |
コード長 | 2,061 bytes |
コンパイル時間 | 2,337 ms |
コンパイル使用メモリ | 78,176 KB |
実行使用メモリ | 37,308 KB |
最終ジャッジ日時 | 2024-09-21 14:43:34 |
合計ジャッジ時間 | 4,144 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 4 |
other | AC * 16 |
ソースコード
import java.io.*; import java.util.*; import java.math.*; class Main { static int h , w; static String[] field; static int[] dx = {0,0,-1,1}; static int[] dy = {-1,1,0,0}; static boolean[][] isSearched; public static void out (Object o) { System.out.println(o); } public static int[] getBlank () { int start = -1; ArrayList<Integer> list = new ArrayList<Integer>(); main:for (int i = 0; i < h; i++) { for (int j = 0; j < w; j++) { if (field[i].charAt(j) == '#' || isSearched[i][j]) continue; isSearched[i][j] = true; start = j << 5 | i; break main; } } list.add(start); Queue<Integer> queue = new LinkedList<Integer>(); queue.add(start); while (!queue.isEmpty()) { int q = queue.poll(); int x = q >> 5; int y = q & 31; for (int i = 0; i < dx.length; i++) { int moveX = x + dx[i]; int moveY = y + dy[i]; if (moveX < 0 || moveX >= w || moveY < 0 || moveY >= h) continue; if (field[moveY].charAt(moveX) == '#' || isSearched[moveY][moveX]) continue; list.add(moveX << 5 | moveY); isSearched[moveY][moveX] = true; queue.add(moveX << 5 | moveY); } } int[] ret = new int[list.size()]; for (int i = 0; i < list.size(); i++) ret[i] = list.get(i); return ret; } public static int solve () { int ret = Integer.MAX_VALUE; int[] bl1 = getBlank(); int[] bl2 = getBlank(); for (int i = 0; i < bl1.length; i++) { int x1 = bl1[i] >> 5; int y1 = bl1[i] & 31; for (int j = 0; j < bl2.length; j++) { int x2 = bl2[j] >> 5; int y2 = bl2[j] & 31; ret = Math.min(ret , Math.abs(x1 - x2) + Math.abs(y1 - y2) - 1); } } return ret; } public static void main (String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String[] line = br.readLine().split(" "); w = Integer.parseInt(line[0]); h = Integer.parseInt(line[1]); field = new String[h]; isSearched = new boolean[h][w]; for (int i = 0; i < h; i++) { field[i] = br.readLine(); } out(solve()); } }