← 返回题目页

P1205 [USACO1.2] 方块转换 Transformations

标程

#include <bits/stdc++.h>
using namespace std;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int n;
    cin >> n;
    vector<string> a(n), b(n);
    for (string &s : a) cin >> s;
    for (string &s : b) cin >> s;

    // 顺时针转 90 度:格子 (i, j) 变成 (j, n - 1 - i)
    auto rotate90 = [&](const vector<string> &g) {
        vector<string> r(n, string(n, ' '));
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                r[j][n - 1 - i] = g[i][j];
            }
        }
        return r;
    };

    // 反射:每一行左右翻转(以中央铅垂线为轴的镜像)
    auto reflect = [&](const vector<string> &g) {
        vector<string> r = g;
        for (string &row : r) reverse(row.begin(), row.end());
        return r;
    };

    // 1~3:转 90 / 180 / 270 度
    vector<string> cur = a;
    for (int k = 1; k <= 3; k++) {
        cur = rotate90(cur);
        if (cur == b) {
            cout << k << "\n";
            return 0;
        }
    }

    // 4:反射
    cur = reflect(a);
    if (cur == b) {
        cout << 4 << "\n";
        return 0;
    }

    // 5:先反射再转 90 / 180 / 270 度
    for (int k = 1; k <= 3; k++) {
        cur = rotate90(cur);
        if (cur == b) {
            cout << 5 << "\n";
            return 0;
        }
    }

    // 6:不改变
    if (a == b) {
        cout << 6 << "\n";
        return 0;
    }

    // 7:无效转换
    cout << 7 << "\n";
    return 0;
}

动画演示