結果

問題 No.424 立体迷路
ユーザー chocorusk
提出日時 2020-10-04 11:12:55
言語 Java
(openjdk 23)
結果
AC  
実行時間 142 ms / 2,000 ms
コード長 3,215 bytes
コンパイル時間 2,507 ms
コンパイル使用メモリ 79,212 KB
実行使用メモリ 41,632 KB
最終ジャッジ日時 2024-07-19 07:17:12
合計ジャッジ時間 7,227 ms
ジャッジサーバーID
(参考情報)
judge2 / judge5
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 5
other AC * 21
権限があれば一括ダウンロードができます

ソースコード

diff #
プレゼンテーションモードにする

import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.util.ArrayDeque;
import java.util.NoSuchElementException;
import java.util.Queue;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
//FastScanner scanner=new FastScanner();
PrintWriter out = new PrintWriter(System.out);
int h=scanner.nextInt();
int w=scanner.nextInt();
int sx=scanner.nextInt();
int sy=scanner.nextInt();
int gx=scanner.nextInt();
int gy=scanner.nextInt();
sx--; sy--; gx--; gy--;
char[][] b=new char[h][w];
for(int i=0; i<h; i++) {
b[i]=scanner.next().toCharArray();
}
int[] dx= {1, -1, 0, 0};
int[] dy= {0, 0, 1, -1};
Queue<Integer> que=new ArrayDeque<Integer>();
que.offer(sx*w+sy);
boolean[][] used=new boolean[h][w];
used[sx][sy]=true;
while(que.size()>0) {
int xy=que.poll();
int x=xy/w, y=xy%w;
for(int k=0; k<4; k++) {
int x1=x+dx[k], y1=y+dy[k];
if(x1<0 || x1>=h || y1<0 || y1>=w) continue;
if(!used[x1][y1] && Math.abs((int)(b[x][y]-b[x1][y1]))<=1) {
used[x1][y1]=true;
que.offer(x1*w+y1);
}
int x2=x+2*dx[k], y2=y+2*dy[k];
if(x2<0 || x2>=h || y2<0 || y2>=w) continue;
if(!used[x2][y2] && b[x][y]==b[x2][y2] && b[x][y]>=b[x1][y1]) {
used[x2][y2]=true;
que.offer(x2*w+y2);
}
}
}
if(used[gx][gy]) out.println("YES");
else out.println("NO");
out.close();
scanner.close();
}
}
class FastScanner {
private final InputStream in = System.in;
private final byte[] buffer = new byte[1024];
private int ptr = 0;
private int buflen = 0;
private boolean hasNextByte() {
if (ptr < buflen) {
return true;
} else {
ptr = 0;
try {
buflen = in.read(buffer);
} catch (IOException e) {
e.printStackTrace();
}
if (buflen <= 0) {
return false;
}
}
return true;
}
private int readByte() {
if (hasNextByte())
return buffer[ptr++];
else
return -1;
}
private static boolean isPrintableChar(int c) {
return 33 <= c && c <= 126;
}
public boolean hasNext() {
while (hasNextByte() && !isPrintableChar(buffer[ptr]))
ptr++;
return hasNextByte();
}
public String next() {
if (!hasNext())
throw new NoSuchElementException();
StringBuilder sb = new StringBuilder();
int b = readByte();
while (isPrintableChar(b)) {
sb.appendCodePoint(b);
b = readByte();
}
return sb.toString();
}
public long nextLong() {
if (!hasNext())
throw new NoSuchElementException();
long n = 0;
boolean minus = false;
int b = readByte();
if (b == '-') {
minus = true;
b = readByte();
}
if (b < '0' || '9' < b) {
throw new NumberFormatException();
}
while (true) {
if ('0' <= b && b <= '9') {
n *= 10;
n += b - '0';
} else if (b == -1 || !isPrintableChar(b)) {
return minus ? -n : n;
} else {
throw new NumberFormatException();
}
b = readByte();
}
}
public int nextInt() {
long nl = nextLong();
if (nl < Integer.MIN_VALUE || nl > Integer.MAX_VALUE)
throw new NumberFormatException();
return (int) nl;
}
public double nextDouble() {
return Double.parseDouble(next());
}
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0