結果
| 問題 |
No.323 yuki国
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2016-09-15 16:08:13 |
| 言語 | Java (openjdk 23) |
| 結果 |
RE
|
| 実行時間 | - |
| コード長 | 3,923 bytes |
| コンパイル時間 | 3,735 ms |
| コンパイル使用メモリ | 78,344 KB |
| 実行使用メモリ | 67,612 KB |
| 最終ジャッジ日時 | 2024-11-17 06:05:32 |
| 合計ジャッジ時間 | 14,932 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 6 |
| other | AC * 31 RE * 1 |
ソースコード
package puzzle.yukicoder.snowcountry;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
public class SnowCountry {
private static int h;
private static int w;
private static int[] start;
private static int[] goal;
private static boolean[][] blocksStatus;
private static boolean[][][] checked;
private static int maxSize;
/*
* スタートからゴールまでのマス数が奇数であれば、開始時の雪玉サイズと終了時の差が奇数でなければならず、マス数が偶数ならサイズ差も偶数である必要がある。まずこの条件を満たすことをチェックする。
* スタートからゴールまでの最長距離はh*wなので、ゴール時の要求サイズ+h*w-2以上の大きさに雪玉が大きくなる必要はない。(ただし、開始のサイズ+h*w-2までは拡大してしまう可能性がある)
*/
public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
h = cin.nextInt();
w = cin.nextInt();
blocksStatus = new boolean[h][w];
start = new int[3];
start[0] = cin.nextInt();
start[1] = cin.nextInt();
start[2] = cin.nextInt();
goal = new int[3];
goal[0] = cin.nextInt();
goal[1] = cin.nextInt();
goal[2] = cin.nextInt();
/* 探索済みの場合記録する */
maxSize = Math.max(start[0], goal[0]) + h * w - 2;
checked = new boolean[maxSize][h][w];
cin.nextLine();
for (int i = 0; i < h; i++) {
char[] charArray = cin.nextLine().toCharArray();
for (int j = 0; j < w; j++) {
if (charArray[j] == '*') {
/* 雪ブロック */
blocksStatus[i][j] = true;
}
}
}
cin.close();
/* 偶奇チェック */
if ((start[0] + goal[0]) % 2 != (start[1] + start[2] + goal[1] + goal[2]) % 2) {
exit(false);
}
/* Start地点から探索開始 */
List<int[]> currentStep = new ArrayList<int[]>();
currentStep.add(new int[] {start[0], start[1] - 1, start[2]});
currentStep.add(new int[] {start[0], start[1] + 1, start[2]});
currentStep.add(new int[] {start[0], start[1], start[2] - 1});
currentStep.add(new int[] {start[0], start[1], start[2] + 1});
while (!currentStep.isEmpty()) {
List<int[]> nextStep = new ArrayList<int[]>();
for (int[] step : currentStep) {
nextStep.addAll(step(step));
}
currentStep = nextStep;
}
exit(false);
}
private static List<int[]> step(int[] block) {
List<int[]> nextStep = new ArrayList<int[]>();
if (block[1] < 0 || block[1] >= h || block[2] < 0 || block[2] >= w) {
return nextStep;
}
if (checked[block[0]][block[1]][block[2]]) {
return nextStep;
}
checked[block[0]][block[1]][block[2]] = true;
if (blocksStatus[block[1]][block[2]]) {
block[0]++;
} else {
block[0]--;
}
if (Arrays.equals(block, goal)) {
exit(true);
}
if (block[0] == 0 || block[0] == maxSize) {
return nextStep;
}
nextStep.add(new int[] {block[0], block[1] - 1, block[2]});
nextStep.add(new int[] {block[0], block[1] + 1, block[2]});
nextStep.add(new int[] {block[0], block[1], block[2] - 1});
nextStep.add(new int[] {block[0], block[1], block[2] + 1});
return nextStep;
}
private static void exit(boolean result) {
if (result) {
System.out.println("Yes");
} else {
System.out.println("No");
}
System.exit(0);
}
}