[AtCoder] ARC 005 B – P-CASカードと高橋君
問題
方針
現在 \( y \) 行 \( x \) 列にいるとします。このとき、境界を超えるような方向は反転されます。
コード
#include <bits/stdc++.h> using namespace std; typedef long long ll; char c[9][9]{}; map<char, char> m1{{'R', 'L'}, {'L', 'R'}, {'U', 'D'}, {'D', 'U'}}; map<char, int> m2 {{'R', 0}, {'L', 1}, {'U', 2}, {'D', 3}}; int dx[4] = {1, -1, 0, 0}; int dy[4] = {0, 0, -1, 1}; void solve(int n, int x, int y, string d) { if (n == 3) { cout << c[y][x] << "\n"; return; } cout << c[y][x]; string t = ""; for (char c : d) { x += dx[m2[c]]; y += dy[m2[c]]; if (x < 0 || x > 8 || y < 0 || y > 8) { t += m1[c]; } else { t += c; } if (x == -1) x = 1; if (x == 9) x = 7; if (y == -1) y = 1; if (y == 9) y = 7; } solve(n + 1, x, y, t); } int main() { int x, y; cin >> x >> y; string d; cin >> d; string t; for (int i = 0; i < 9; i++) { cin >> t; for (int j = 0; j < 9; j++) { c[i][j] = t[j]; } } solve(0, x - 1, y - 1, d); return 0; }
感想
境界を超えるときの座標の修正を最後に行うのではなく、境界を超えた時に行うことに注意します。
ディスカッション
コメント一覧
まだ、コメントがありません