[AtCoder] ARC 005 B – P-CASカードと高橋君

2020年12月12日

問題

方針

現在 \( 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;
}

感想

境界を超えるときの座標の修正を最後に行うのではなく、境界を超えた時に行うことに注意します。