Yuulis.log

Yuulis.log

トンネルを抜けるとそこは参照エラーであった。

【AtCoder】ABC 364 B - Grid Walk | 茶コーダーが解くAtCoder

atcoder.jp

実行時間制限: 2 sec / メモリ制限: 1024 MB / Difficulty: 79

問題概要

 H W 列のグリッドがあり、グリッドの上から  i 行目、左から  j 列目のマスをマス  (i, j) とする。マス  i, j C_{i, j} =.のとき空きマスで、#のときそうではない。 現在いるマスはマス  (S_i, S_j) である。これから、文字列  X の 内容に沿って以下のルールでグリッド上を移動する。

  • ルール
    •  X_i =Lのとき、現在いるマスの左にマスが存在し、且つそのマスが空きマスなら1マス左に移動する。そうでないときは移動しない。
    •  X_i =Rのとき、現在いるマスの右にマスが存在し、且つそのマスが空きマスなら1マス右に移動する。そうでないときは移動しない。
    •  X_i =Uのとき、現在いるマスの上にマスが存在し、且つそのマスが空きマスなら1マス上に移動する。そうでないときは移動しない。
    •  X_i =Dのとき、現在いるマスの下にマスが存在し、且つそのマスが空きマスなら1マス下に移動する。そうでないときは移動しない。

このとき、最終的にいるマスを求めよ。

制約

  •  1 \leq H, W \leq 50
  •  1 \leq S_i \leq H
  •  1 \leq S_j \leq W
  •  X の長さは  1 以上  50 以下。

考察

グリッドのサイズが小さいので、移動1回ごとにシミュレーションしていけばいいだろう。添字のミスに注意。

コード

#include <bits/stdc++.h>
using namespace std;

#define rep(i, start, end) for (auto i = (start); (i) < (end); (i)++)

// ======================================== //

int main()
{
    int H, W, S_i, S_j;
    cin >> H >> W >> S_i >> S_j;
    vector<vector<char>> C(H, vector<char>(W));
    rep(i, 0, H) rep(j, 0, W) cin >> C[i][j];
    string X;
    cin >> X;

    S_i--;
    S_j--;

    for (auto &&c : X)
    {
        if (c == 'L')
        {
            if (S_j > 0 && C[S_i][S_j - 1] == '.')
                S_j--;
        }
        else if (c == 'R')
        {
            if (S_j < W - 1 && C[S_i][S_j + 1] == '.')
                S_j++;
        }
        else if (c == 'U')
        {
            if (S_i > 0 && C[S_i - 1][S_j] == '.')
                S_i--;
        }
        else if (c == 'D')
        {
            if (S_i < H - 1 && C[S_i + 1][S_j] == '.')
                S_i++;
        }
    }

    cout << S_i + 1 << " " << S_j + 1 << endl;
}

atcoder.jp

実装時間: 5分