1 条题解

  • 0
    @ 2089-10-19 7:01:18

    【深基5.习11】[USACO1.2] 方块转换 Transformations

    解题思路

    实现顺时针旋转与左右镜像函数。按编号 1~6 的优先级依次比较目标图案,首个匹配立即输出;都不匹配输出 7。

    正确性说明

    旋转映射 (i,j)→(j,n-1-i) 正确转 90 度;镜像映射 (i,j)→(i,n-1-j) 正确翻转。枚举全部允许变换并按编号检查,得到最小可用编号。

    易错点

    组合是先镜像再旋转,不是转置;不改变的优先级在组合之后。

    复杂度

    时间 O(n²),空间 O(n²)。

    参考代码(C++11)

    #include <bits/stdc++.h>
    using namespace std;
    
    vector<string> rot(const vector<string> &a) {
        int n = a.size();
        vector<string> b(n, string(n, ' '));
        for (int i = 0; i < n; i++)
            for (int j = 0; j < n; j++)
                b[j][n - 1 - i] = a[i][j];
        return b;
    }
    vector<string> mirror(vector<string> a) {
        for (string &s : a)
            reverse(s.begin(), s.end());
        return a;
    }
    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;
        auto t = a;
        for (int k = 1; k <= 3; k++) {
            t = rot(t);
            if (t == b) {
                cout << k << "\n";
                return 0;
            }
        }
        t = mirror(a);
        if (t == b) {
            cout << 4 << "\n";
            return 0;
        }
        for (int k = 1; k <= 3; k++) {
            t = rot(t);
            if (t == b) {
                cout << 5 << "\n";
                return 0;
            }
        }
        cout << (a == b ? 6 : 7) << "\n";
        return 0;
    }
    
    • 1

    【深基5.习11】[USACO1.2] 方块转换 Transformations

    信息

    ID
    99
    时间
    1000ms
    内存
    125MiB
    难度
    进阶
    标签
    递交数
    1
    已通过
    1
    上传者