結果
問題 | No.13 囲みたい! |
ユーザー | yuki2006 |
提出日時 | 2015-02-04 01:43:22 |
言語 | Java21 (openjdk 21) |
結果 |
AC
|
実行時間 | 262 ms / 5,000 ms |
コード長 | 2,994 bytes |
コンパイル時間 | 2,239 ms |
コンパイル使用メモリ | 79,780 KB |
実行使用メモリ | 58,848 KB |
最終ジャッジ日時 | 2024-10-13 10:40:36 |
合計ジャッジ時間 | 6,511 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 130 ms
53,856 KB |
testcase_01 | AC | 130 ms
54,096 KB |
testcase_02 | AC | 136 ms
53,944 KB |
testcase_03 | AC | 252 ms
58,516 KB |
testcase_04 | AC | 241 ms
58,172 KB |
testcase_05 | AC | 261 ms
58,400 KB |
testcase_06 | AC | 236 ms
58,324 KB |
testcase_07 | AC | 262 ms
58,228 KB |
testcase_08 | AC | 253 ms
58,848 KB |
testcase_09 | AC | 253 ms
58,668 KB |
testcase_10 | AC | 200 ms
56,952 KB |
testcase_11 | AC | 239 ms
57,700 KB |
testcase_12 | AC | 177 ms
54,320 KB |
testcase_13 | AC | 206 ms
56,820 KB |
testcase_14 | AC | 202 ms
57,580 KB |
testcase_15 | AC | 133 ms
53,936 KB |
ソースコード
import java.util.*; import java.lang.*; import java.io.*; public class Main { public static final String IMPOSSIBLE = "impossible"; public static final String POSSIBLE = "possible"; int W; int H; char[][] matrix; int[][] visited; //クラスを使わずにしてみたかったので int getPos(int y, int x) { return y * W + x; } void input() { Scanner scanner = new Scanner(System.in); //番兵を含む W = scanner.nextInt() + 2; H = scanner.nextInt() + 2; scanner.nextLine(); matrix = new char[H][W]; for (int i = 1; i < H - 1; i++) { for (int j = 1; j < W - 1; j++) { matrix[i][j] = (char) scanner.nextInt(); } } } public Main() { input(); visited = new int[H][W]; for (int i = 0; i < H; i++) { Arrays.fill(visited[i], -1); } for (int i = 1; i < H - 1; i++) { for (int j = 1; j < W - 1; j++) { if (visited[i][j] != -1) { continue; } if (bfs(i, j)) { System.out.println(POSSIBLE); return; } } } System.out.println(IMPOSSIBLE); } private boolean bfs(int startY, int startX) { LinkedList<Integer> queue = new LinkedList<Integer>(); queue.add(getPos(startY, startX)); char currentNum = matrix[startY][startX]; visited[startY][startX] = 0; while (queue.size() > 0) { final Integer next = queue.pop(); int x = next % (W); int y = next / (W); for (int i = -1; i <= 1; i++) { for (int j = -1; j <= 1; j++) { int p2 = x + i; int p1 = y + j; // if (p1 == -1 || p2 == -1) { // System.out.println("--"+x + ":" + y + "--" + next); // System.exit(0); // } if (Math.abs(i) + Math.abs(j) == 1 && matrix[p1][p2] == currentNum) { //次の場所が別の親になっているかどうかをチェックします。 if (visited[p1][p2] == 0 || visited[y][x] == getPos(p1, p2)) { continue; } if (visited[p1][p2] != -1) { //この時点で囲める return true; } //次の場所の親が元の場所と設定します。 visited[p1][p2] = getPos(y, x); int pos = getPos(p1, p2); queue.add(pos); } } } } return false; } public static void main(String[] args) { new Main(); } }