結果
| 問題 |
No.367 ナイトの転身
|
| コンテスト | |
| ユーザー |
purple_jwl
|
| 提出日時 | 2016-05-06 22:52:00 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
AC
|
| 実行時間 | 49 ms / 2,000 ms |
| コード長 | 2,008 bytes |
| コンパイル時間 | 1,418 ms |
| コンパイル使用メモリ | 167,272 KB |
| 実行使用メモリ | 5,248 KB |
| 最終ジャッジ日時 | 2024-10-05 10:12:27 |
| 合計ジャッジ時間 | 2,398 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 27 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
// k: knight
const vector<int> kdx {-1, 1, -2, 2, -2, 2, -1, 1};
const vector<int> kdy {-2, -2, -1, -1, 1, 1, 2, 2};
// b: bishop
const vector<int> bdx {-1, 1, -1, 1};
const vector<int> bdy {-1, -1, 1, 1};
int H, W;
int sx, sy, gx, gy;
char board[500][500];
// k: minStep[][][0]
// b: minStep[][][1]
bool visited[500][500][2];
// k: piece == 0
// b: piece == 1
struct State {
int x, y, step, piece;
State() {}
State(int _x, int _y, int _step, int _piece) :
x(_x), y(_y), step(_step), piece(_piece) {}
};
int solve() {
memset(visited, false, sizeof(visited));
queue<State> Q;
Q.push(State(sx, sy, 0, 0));
visited[sy][sx][0] = true;
while (!Q.empty()) {
State stt = Q.front();
Q.pop();
vector<int> dx, dy;
if (stt.piece == 0) {
dx = kdx;
dy = kdy;
} else {
dx = bdx;
dy = bdy;
}
for (int i = 0; i < dx.size(); i++) {
int x = stt.x + dx[i];
int y = stt.y + dy[i];
int piece = stt.piece;
if (!(0 <= x && x < W) || !(0 <= y && y < H)) {
continue;
}
if (x == gx && y == gy) {
return stt.step + 1;
}
if (board[y][x] == 'R') {
piece = 1 - piece;
}
if (visited[y][x][piece]) {
continue;
}
visited[y][x][piece] = true;
Q.push(State(x, y, stt.step + 1, piece));
}
}
return -1;
}
int main() {
cin >> H >> W;
for (int i = 0; i < H; i++) {
for (int j = 0; j < W; j++) {
cin >> board[i][j];
if (board[i][j] == 'S') {
sy = i;
sx = j;
}
if (board[i][j] == 'G') {
gy = i;
gx = j;
}
}
}
cout << solve() << endl;
return 0;
}
purple_jwl