二次元グリッド上のシミュレーション問題!
問題概要
のグリッドが与えられる。各マスは
- '.':通路マス
- '#':壁マス
- '@':アイテムマス
のいずれかである。最初、マス にいる。
今、グリッド上で文字列 に示す移動をする(U, D, L, R のいずれか)。ただし、移動先が壁マスである場合は移動しない。移動先のマスがアイテムマスであれば、アイテムを回収する。一度アイテムを回収すると、空きマスとなる。
すべての移動を終えたあとのマスの位置と、回収したアイテムの個数を求めよ。
制約
考えたこと
文字列 の各文字
に対して、マス
から次の移動をする。
= 'U' のとき:
が 1 小さくなる
= 'D' のとき:
が 1 大きくなる
= 'L' のとき:
が 1 小さくなる
= 'R' のとき:
が 1 大きくなる
ただし、移動後のマスが壁である場合は、マスを現状維持とする。
さらに「一度回収したアイテムはなくなる」を実現するには、次のようにすればよい。
グリッドの該当のマスを '@' から '.' に更新する
コード
#include <bits/stdc++.h> using namespace std; int main() { int H, W, x, y; cin >> H >> W >> x >> y, x--, y--; vector<string> S(H); for (int i = 0; i < H; i++) cin >> S[i]; string T; cin >> T; int res = 0; for (auto c : T) { int x2 = x, y2 = y; if (c == 'U') x2--; else if (c == 'D') x2++; else if (c == 'L') y2--; else y2++; if (S[x2][y2] == '#') continue; else { if (S[x2][y2] == '@') { res++; S[x2][y2] = '.'; // 一度回収したら空きマスにする } x = x2, y = y2; } } cout << x+1 << " " << y+1 << " " << res << endl; }