結果
| 問題 |
No.367 ナイトの転身
|
| コンテスト | |
| ユーザー |
ID
|
| 提出日時 | 2016-05-01 19:09:53 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,363 bytes |
| コンパイル時間 | 876 ms |
| コンパイル使用メモリ | 88,240 KB |
| 実行使用メモリ | 6,820 KB |
| 最終ジャッジ日時 | 2024-10-05 00:45:37 |
| 合計ジャッジ時間 | 1,873 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 26 WA * 1 |
ソースコード
#include <algorithm>
#include <climits>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <functional>
#include <iostream>
#include <map>
#include <ostream>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <vector>
#define INF 1000000000
#define rep(i,a,b) for (int i=(a);i<(b);i++)
#define rev(i,a,b) for (int i=(a)-1;i>=b;i--)
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef queue<int> qi;
typedef vector<int> vi;
typedef vector<string> vs;
int dx[4] = { 0, 1, 0, -1 };
int dy[4] = { 1, 0, -1, 0 };
int h, w;
char s[500][501];
int m[2][500][500];
int nmx[] = { 1, 2, -1, -2, 1, 2, -1, -2};
int nmy[] = {-2, -1, -2, -1, 2, 1, 2, 1};
int bmx[] = {1, 1, -1, -1};
int bmy[] = {1, -1, 1, -1};
void solve() {
int sx, sy;
rep(i,0,h)
rep(j,0,w) {
if(s[i][j] == 'S') {
sy = i;
sx = j;
}
}
rep(i,0,h)
rep(j,0,w) {
m[0][i][j] = INF;
m[1][i][j] = INF;
}
qi qx, qy, qt, qbt;
qx.push(sx);
qy.push(sy);
qt.push(0);
qbt.push(0);
m[0][sy][sx] = 0;
while(!qx.empty()) {
int x = qx.front();
int y = qy.front();
int t = qt.front();
int bt = qbt.front();
qx.pop();
qy.pop();
qt.pop();
qbt.pop();
if(s[y][x] == 'G') {
cout << min(m[0][y][x], m[1][y][x]) << endl;
return ;
}
if(t == 0) {
rep(i,0,8) {
int mx = x + nmx[i];
int my = y + nmy[i];
if(0 <= mx && mx < w && 0 <= my && my < h && m[t][my][mx] == INF) {
if(s[my][mx] == 'R') {
if(m[1][my][mx] != INF) continue;
qt.push(1);
m[1][my][mx] = m[t][y][x] + 1;
} else {
if(m[0][my][mx] != INF) continue;
qt.push(0);
m[0][my][mx] = m[t][y][x] + 1;
}
qbt.push(t);
qx.push(mx);
qy.push(my);
}
}
} else {
rep(i,0,4) {
int mx = x + bmx[i];
int my = y + bmy[i];
if(0 <= mx && mx < w && 0 <= my && my < h) {
if(s[my][mx] == 'R') {
if(m[0][my][mx] != INF) continue;
qt.push(0);
m[0][my][mx] = m[t][y][x] + 1;
} else {
if(m[1][my][mx] != INF) continue;
qt.push(1);
m[1][my][mx] = m[t][y][x] + 1;
}
qbt.push(t);
qx.push(mx);
qy.push(my);
}
}
}
}
cout << "-1" << endl;
}
int main() {
cin.tie(0);
ios::sync_with_stdio(false);
cin >> h >> w;
rep(i,0,h) cin >> s[i];
solve();
return 0;
}
ID