はまやんはまやんはまやん

hamayanhamayan's blog

電光掲示板 [第三回 アルゴリズム実技検定 D]

https://atcoder.jp/contests/past202005-open/tasks/past202005_d

解説

https://atcoder.jp/contests/past202005-open/submissions/14066582

パターンマッチングを頑張る問題。
パターンマッチングなので、数と対応した文字列を紐づける必要があるが、
丁度入力例1で0から順に整備されたやつがあるので、使おう。

それベースで見ると、横4縦5で数字が表現されている。
なので、マッチングするかは、このサイズで比較すればいいだろう。
後は、頑張ってマッチングしていくだけなのだが、何とも説明しようがない。
ok := マッチングしているか
ok変数をtrueにしといて、長方形をクロールして違っている所があればok=falseにしている。
全部あってればokがtrueのはずなので、そうなったら答えにその数を入れ込む。

int N;
string S[5];
string test[5] = {
    ".###..#..###.###.#.#.###.###.###.###.###.",
    ".#.#.##....#...#.#.#.#...#.....#.#.#.#.#.",
    ".#.#..#..###.###.###.###.###...#.###.###.",
    ".#.#..#..#.....#...#...#.#.#...#.#.#...#.",
    ".###.###.###.###...#.###.###...#.###.###."
};
//---------------------------------------------------------------------------------------------------
void _main() {
    cin >> N;
    rep(i, 0, 5) cin >> S[i];

    string ans = "";
    rep(j, 0, N) {
        int L = j * 4;
        rep(c, 0, 10) {
            bool ok = true;
            rep(y, 0, 4) rep(x, 0, 5) if (S[x][j * 4 + y] != test[x][c * 4 + y]) ok = false;
            if (ok) ans += char('0' + c);
        }
    }
    cout << ans << endl;
}