結果
問題 | No.424 立体迷路 |
ユーザー |
![]() |
提出日時 | 2019-07-21 11:53:18 |
言語 | Java (openjdk 23) |
結果 |
AC
|
実行時間 | 179 ms / 2,000 ms |
コード長 | 3,914 bytes |
コンパイル時間 | 2,423 ms |
コンパイル使用メモリ | 77,832 KB |
実行使用メモリ | 42,232 KB |
最終ジャッジ日時 | 2024-07-05 07:18:44 |
合計ジャッジ時間 | 6,615 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 5 |
other | AC * 21 |
ソースコード
import java.util.*;public class Main {static int[] par;static int[] rank;static int[] height;static int h;static int w;public static void main(String[] args) {Scanner sc = new Scanner(System.in);h = sc.nextInt();w = sc.nextInt();par = new int[h * w];rank = new int[h * w];height = new int[h * w];int sx = sc.nextInt();int sy = sc.nextInt();int gx = sc.nextInt();int gy = sc.nextInt();init(h * w);for(int i = 0; i < h; i++) {String b = sc.next();for(int j = 0; j < w; j++) {height[(w * i) + j] = Integer.parseInt(String.valueOf(b.charAt(j)));}}for(int i = 0; i < h * w; i++) {if((i - w) >= 0) unite((i - w), i);if((i + w) < (h * w)) unite((i + w), i);if((i - 1) >= 0) unite((i - 1), i);if((i + 1) < (h * w)) unite((i + 1), i);if((i - (2 * w)) >= 0) unite((i - (2 * w)), i);if((i + (2 * w)) < (h * w)) unite((i + (2 * w)), i);if((i - 2) >= 0) unite((i - 2), i);if((i + 2) < (h * w)) unite((i + 2), i);}String ans = "YES";if(!same(((w * (sx - 1)) + sy - 1), ((w * (gx - 1)) + gy - 1))) ans = "NO";System.out.println(ans);}static void init(int m) {for(int i = 0; i < m; i++) {par[i] = i;rank[i] = 0;}}static int find(int x) {if(par[x] == x) {return x;} else {return par[x] = find(par[x]);}}static void unite(int x, int y) {if(find(x) != find(y)) {int i1 = x / w;int j1 = x - (i1 * w);int i2 = y / w;int j2 = y - (i2 * w);if(((i1 == i2) && (Math.abs(j1 - j2) == 1)) || ((j1 == j2) && (Math.abs(i1 - i2) == 1))) {if(Math.abs(height[x] - height[y]) <= 1) {int x1 = find(x);int y1 = find(y);if(rank[x1] > rank[y1]) {par[y1] = x1;} else {par[x1] = y1;if(rank[x1] == rank[y1]) {rank[y1]++;} else {}}}}if(((i1 == i2) && (Math.abs(j1 - j2) == 2)) || ((j1 == j2) && (Math.abs(i1 - i2) == 2))) {if((j1 - j2) == 2) {if((height[x] == height[y]) && (height[x] > height[x - 1])) {int x1 = find(x);int y1 = find(y);if(rank[x1] > rank[y1]) {par[y1] = x1;} else {par[x1] = y1;if(rank[x1] == rank[y1]) {rank[y1]++;} else {}}}}if((j1 - j2) == (-1) * 2) {if((height[x] == height[y]) && (height[x] > height[x + 1])) {int x1 = find(x);int y1 = find(y);if(rank[x1] > rank[y1]) {par[y1] = x1;} else {par[x1] = y1;if(rank[x1] == rank[y1]) {rank[y1]++;} else {}}}}if((i1 - i2) == 2) {if((height[x] == height[y]) && (height[x] > height[x - w])) {int x1 = find(x);int y1 = find(y);if(rank[x1] > rank[y1]) {par[y1] = x1;} else {par[x1] = y1;if(rank[x1] == rank[y1]) {rank[y1]++;} else {}}}}if((i1 - i2) == (-1) * 2) {if((height[x] == height[y]) && (height[x] > height[x + w])) {int x1 = find(x);int y1 = find(y);if(rank[x1] > rank[y1]) {par[y1] = x1;} else {par[x1] = y1;if(rank[x1] == rank[y1]) {rank[y1]++;} else {}}}}}}}static boolean same(int x, int y) {return find(x) == find(y);}}