実行時間制限: 2 sec / メモリ制限: 1024 MB / Difficulty: 79
問題概要
行 列のグリッドがあり、グリッドの上から 行目、左から 列目のマスをマス とする。マス は .
のとき空きマスで、#
のときそうではない。
現在いるマスはマス である。これから、文字列 の 内容に沿って以下のルールでグリッド上を移動する。
- ルール
L
のとき、現在いるマスの左にマスが存在し、且つそのマスが空きマスなら1マス左に移動する。そうでないときは移動しない。R
のとき、現在いるマスの右にマスが存在し、且つそのマスが空きマスなら1マス右に移動する。そうでないときは移動しない。U
のとき、現在いるマスの上にマスが存在し、且つそのマスが空きマスなら1マス上に移動する。そうでないときは移動しない。D
のとき、現在いるマスの下にマスが存在し、且つそのマスが空きマスなら1マス下に移動する。そうでないときは移動しない。
このとき、最終的にいるマスを求めよ。
制約
- の長さは 以上 以下。
考察
グリッドのサイズが小さいので、移動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; }
実装時間: 5分