結果
問題 | No.157 2つの空洞 |
ユーザー | jp_ste |
提出日時 | 2015-03-17 11:19:06 |
言語 | Java21 (openjdk 21) |
結果 |
AC
|
実行時間 | 150 ms / 2,000 ms |
コード長 | 2,769 bytes |
コンパイル時間 | 2,407 ms |
コンパイル使用メモリ | 78,520 KB |
実行使用メモリ | 45,276 KB |
最終ジャッジ日時 | 2024-06-28 23:07:21 |
合計ジャッジ時間 | 5,979 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 130 ms
41,336 KB |
testcase_01 | AC | 132 ms
41,228 KB |
testcase_02 | AC | 135 ms
41,364 KB |
testcase_03 | AC | 132 ms
41,216 KB |
testcase_04 | AC | 136 ms
41,380 KB |
testcase_05 | AC | 136 ms
41,620 KB |
testcase_06 | AC | 136 ms
41,560 KB |
testcase_07 | AC | 134 ms
41,840 KB |
testcase_08 | AC | 137 ms
41,440 KB |
testcase_09 | AC | 124 ms
40,424 KB |
testcase_10 | AC | 133 ms
41,444 KB |
testcase_11 | AC | 136 ms
41,820 KB |
testcase_12 | AC | 144 ms
44,128 KB |
testcase_13 | AC | 141 ms
43,248 KB |
testcase_14 | AC | 136 ms
41,468 KB |
testcase_15 | AC | 142 ms
42,652 KB |
testcase_16 | AC | 140 ms
43,584 KB |
testcase_17 | AC | 141 ms
41,768 KB |
testcase_18 | AC | 150 ms
45,276 KB |
testcase_19 | AC | 149 ms
43,584 KB |
ソースコード
import java.util.LinkedList; import java.util.Queue; import java.util.Scanner; public class Main { static int W, H; static char C[][]; static int DP[][]; static int mAns = Integer.MAX_VALUE; public static void main(String[] args) { readMap(); boolean find = false; for(int i=0; i<H; i++) { for(int j=0; j<W; j++) { if(C[i][j] == '.') { replaceCavity(j, i, '+'); find=true; break; } } if(find) break; } for(int i=0; i<H; i++) { for(int j=0; j<W; j++) { if(C[i][j] == '.') { solve(j, i); } } } System.out.println(mAns-1); } static void solve(int startX, int startY) { Queue<Node> q = new LinkedList<Node>(); Node start = new Node(startX, startY, 0, C); q.add(start); while(!q.isEmpty()) { Node node = q.poll(); if(DP[node.mY][node.mX] <= node.mStep) continue; DP[node.mY][node.mX] = node.mStep; if(mAns <= node.mStep) continue; if(node.mX == 0 || node.mX == W-1) continue; if(node.mY == 0 || node.mY == H-1) continue; if(node.mMap[node.mY][node.mX] == '+') { mAns = Math.min(mAns, node.mStep); continue; } node.mMap[node.mY][node.mX] = '.'; int nextStep = node.mStep+1; int nextX, nextY; char nextMap[][] = node.mMap; //上 nextX = node.mX; nextY = node.mY-1; if(node.mMap[nextY][nextX] != '.') { Node next = new Node(nextX, nextY, nextStep, nextMap); q.add(next); } //右 nextX = node.mX+1; nextY = node.mY; if(node.mMap[nextY][nextX] != '.') { Node next = new Node(nextX, nextY, nextStep, nextMap); q.add(next); } //下 nextX = node.mX; nextY = node.mY+1; if(node.mMap[nextY][nextX] != '.') { Node next = new Node(nextX, nextY, nextStep, nextMap); q.add(next); } //左 nextX = node.mX-1; nextY = node.mY; if(node.mMap[nextY][nextX] != '.') { Node next = new Node(nextX, nextY, nextStep, nextMap); q.add(next); } } } static void readMap() { Scanner sc = new Scanner(System.in); W = sc.nextInt(); H = sc.nextInt(); C = new char[H][W]; DP = new int[H][W]; for(int i=0; i<H; i++) { String line = sc.next(); for(int j=0; j<W; j++) { C[i][j] = line.charAt(j); DP[i][j] = Integer.MAX_VALUE; } } } static void replaceCavity(int j, int i, char v) { if(C[i][j] != '.') return; C[i][j] = v; replaceCavity(j+1, i , v); replaceCavity(j , i+1, v); replaceCavity(j-1, i , v); replaceCavity(j , i-1, v); } } class Node { int mX, mY, mStep; char mMap[][]; Node(int x, int y, int step, char[][] map) { mX = x; mY = y; mStep = step; mMap = new char[Main.H][Main.W]; for(int i=0; i<Main.H; i++) { mMap[i] = map[i].clone(); } } }