結果
| 問題 |
No.367 ナイトの転身
|
| コンテスト | |
| ユーザー |
jp_ste
|
| 提出日時 | 2016-05-12 18:18:58 |
| 言語 | Java (openjdk 23) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 3,558 bytes |
| コンパイル時間 | 3,621 ms |
| コンパイル使用メモリ | 79,112 KB |
| 実行使用メモリ | 60,532 KB |
| 最終ジャッジ日時 | 2024-10-05 13:59:38 |
| 合計ジャッジ時間 | 8,555 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 19 WA * 8 |
ソースコード
import java.util.ArrayDeque;
import java.util.Scanner;
public class Main2 {
static int h,w;
static char list[][];
static int dp[][];
static int goalX, goalY;
static final int NIGHT = 1;
static final int BISHOP = 2;
static int nDirX[] = { 1, 1, -1, -1, 2, 2, -2, -2 };
static int nDirY[] = { 2, -2, 2, -2, 1, -1, 1, -1 };
static int bDirX[] = { 1, 1, -1, -1 };
static int bDirY[] = { 1, -1, 1, -1 };
public static void main(String[] args) {
try (Scanner scan = new Scanner(System.in)) {
h = Integer.parseInt(scan.next());
w = Integer.parseInt(scan.next());
list = new char[h][w];
dp = new int[h][w];
int startX = 0, startY = 0;
for(int i=0; i<h; i++) {
String line = scan.next();
for(int j=0; j<w; j++) {
char ch = line.charAt(j);
list[i][j] = ch;
if(ch == 'G') {
goalX = j;
goalY = i;
} else if(ch == 'S') {
startX = j;
startY = i;
}
dp[i][j] = Integer.MAX_VALUE;
}
}
solve(startX, startY);
}
}
static void solve(int startX, int startY) {
ArrayDeque<Node> q = new ArrayDeque<>();
Node s = new Node(startX, startY, 0, NIGHT);
q.addFirst(s);
while(!q.isEmpty()) {
Node now = q.pollFirst();
if(now.x == goalX && now.y == goalY) {
System.out.println(now.steps);
break;
}
if(dp[now.y][now.x] > now.steps) {
dp[now.y][now.x] = now.steps;
} else {
continue;
}
if(now.state == NIGHT) {
for(int i=0; i<8; i++) {
int nextX = now.x + nDirX[i];
int nextY = now.y + nDirY[i];
if(nextX >= 0 && nextX <= w-1 && nextY >= 0 && nextY <= h-1 ) {
int nextState = now.state;
if(list[nextY][nextX] == 'R') {
nextState = BISHOP;
}
Node next = new Node(nextX, nextY, now.steps+1, nextState);
q.addLast(next);
}
}
} else if(now.state == BISHOP) {
for(int i=0; i<4; i++) {
int nextX = now.x + bDirX[i];
int nextY = now.y + bDirY[i];
if(nextX >= 0 && nextX <= w-1 && nextY >= 0 && nextY <= h-1 ) {
int nextState = now.state;
if(list[nextY][nextX] == 'R') {
nextState = NIGHT;
}
Node next = new Node(nextX, nextY, now.steps+1, nextState);
q.addLast(next);
}
}
}
}
}
}
class Node {
int x, y;
int steps;
int state;
Node(int x, int y, int steps, int state) {
this.x = x;
this.y = y;
this.steps = steps;;
this.state = state;
}
}
jp_ste