結果

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

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 WA -
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 WA -
testcase_05 AC 3 ms
5,376 KB
testcase_06 AC 3 ms
5,376 KB
testcase_07 AC 3 ms
5,376 KB
testcase_08 WA -
testcase_09 WA -
testcase_10 AC 24 ms
5,632 KB
testcase_11 WA -
testcase_12 WA -
testcase_13 AC 10 ms
5,504 KB
testcase_14 WA -
testcase_15 WA -
testcase_16 WA -
testcase_17 AC 4 ms
5,376 KB
testcase_18 WA -
testcase_19 WA -
testcase_20 AC 4 ms
5,376 KB
testcase_21 WA -
testcase_22 AC 3 ms
5,248 KB
testcase_23 WA -
testcase_24 WA -
testcase_25 WA -
testcase_26 WA -
権限があれば一括ダウンロードができます

ソースコード

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] == 'G' ? 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