結果

問題 No.367 ナイトの転身
ユーザー 37kt_37kt_
提出日時 2016-09-29 13:37:35
言語 C++11
(gcc 11.4.0)
結果
AC  
実行時間 29 ms / 2,000 ms
コード長 2,436 bytes
コンパイル時間 1,590 ms
コンパイル使用メモリ 175,532 KB
実行使用メモリ 5,632 KB
最終ジャッジ日時 2024-11-21 10:27:44
合計ジャッジ時間 2,697 ms
ジャッジサーバーID
(参考情報)
judge5 / judge2
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 3 ms
5,376 KB
testcase_01 AC 3 ms
5,376 KB
testcase_02 AC 4 ms
5,376 KB
testcase_03 AC 3 ms
5,376 KB
testcase_04 AC 3 ms
5,376 KB
testcase_05 AC 3 ms
5,376 KB
testcase_06 AC 3 ms
5,376 KB
testcase_07 AC 3 ms
5,504 KB
testcase_08 AC 3 ms
5,376 KB
testcase_09 AC 3 ms
5,376 KB
testcase_10 AC 20 ms
5,632 KB
testcase_11 AC 29 ms
5,632 KB
testcase_12 AC 17 ms
5,504 KB
testcase_13 AC 15 ms
5,504 KB
testcase_14 AC 15 ms
5,504 KB
testcase_15 AC 4 ms
5,504 KB
testcase_16 AC 15 ms
5,376 KB
testcase_17 AC 5 ms
5,376 KB
testcase_18 AC 5 ms
5,376 KB
testcase_19 AC 7 ms
5,376 KB
testcase_20 AC 5 ms
5,248 KB
testcase_21 AC 6 ms
5,376 KB
testcase_22 AC 3 ms
5,376 KB
testcase_23 AC 4 ms
5,376 KB
testcase_24 AC 3 ms
5,376 KB
testcase_25 AC 4 ms
5,248 KB
testcase_26 AC 3 ms
5,376 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

/* template.cpp [[[ */
#include <bits/stdc++.h>
using namespace std;
#define get_macro(a, b, c, d, name, ...) name
#define rep(...) get_macro(__VA_ARGS__, rep4, rep3, rep2, rep1)(__VA_ARGS__)
#define rrep(...) get_macro(__VA_ARGS__, rrep4, rrep3, rrep2, rrep1)(__VA_ARGS__)
#define rep1(n) rep2(i_, n)
#define rep2(i, n) rep3(i, 0, n)
#define rep3(i, a, b) rep4(i, a, b, 1)
#define rep4(i, a, b, s) for (ll i = (a); i < (ll)(b); i += (ll)s)
#define rrep1(n) rrep2(i_, n)
#define rrep2(i, n) rrep3(i, 0, n)
#define rrep3(i, a, b) rrep4(i, a, b, 1)
#define rrep4(i, a, b, s) for (ll i = (ll)(b) - 1; i >= (ll)(a); i -= (ll)s)
#define each(x, c) for (auto &&x : c)
#define fs first
#define sc second
#define all(c) begin(c), end(c)
using ui = unsigned;
using ll = long long;
using ul = unsigned long long;
using ld = long double;
const int inf = 1e9 + 10;
const ll inf_ll = 1e18 + 10;
const ll mod = 1e9 + 7;
const ll mod9 = 1e9 + 9;
//const int dx[]{-1, 0, 1, 0, -1, 1, 1, -1};
//const int dy[]{0, -1, 0, 1, -1, -1, 1, 1};
template<class T, class U> void chmin(T &x, const U &y){ x = min<T>(x, y); }
template<class T, class U> void chmax(T &x, const U &y){ x = max<T>(x, y); }
struct prepare_ { prepare_(){ cin.tie(nullptr); ios::sync_with_stdio(false); cout << fixed << setprecision(12); } } prepare__;
ll in(){ ll x; cin >> x; return x; }
vector<ll> in(size_t n){ vector<ll> v(n); each(x, v) cin >> x; return v; }
/* ]]] */

const vector<vector<int>> dx{
  {-2, -2, -1, 1, 2, 2, 1, -1},
  {-1, -1, 1, 1}
};
const vector<vector<int>> dy{
  {-1, 1, 2, 2, 1, -1, -2, -2},
  {-1, 1, 1, -1}
};

int h, w;
string s[500];
int sx, sy, gx, gy;
int d[500][500][2];

int main(){
  cin >> h >> w;
  rep(i, h) cin >> s[i];
  rep(i, h) rep(j, w){
    if (s[i][j] == 'S') sx = i, sy = j;
    if (s[i][j] == 'G') gx = i, gy = j;
  }
  queue<tuple<int, int, int>> q;
  fill_n(**d, 500 * 500 * 2, inf);
  d[sx][sy][0] = 0;
  q.emplace(sx, sy, 0);
  while (q.size()){
    int x, y, t;
    tie(x, y, t) = q.front(), q.pop();
    rep(i, dx[t].size()){
      int nx = x + dx[t][i];
      int ny = y + dy[t][i];
      if (nx < 0 || h <= nx) continue;
      if (ny < 0 || w <= ny) continue;
      int nt = t ^ (s[nx][ny] == 'R' ? 1 : 0);
      if (d[nx][ny][nt] > d[x][y][t] + 1){
        d[nx][ny][nt] = d[x][y][t] + 1;
        q.emplace(nx, ny, nt);
      }
    }
  }
  int res = min(d[gx][gy][0], d[gx][gy][1]);
  cout << (res == inf ? -1 : res) << endl;
}
0