1 条题解

  • 0
    @ 2026-4-3 19:25:15

    练64.2 图像旋转翻转变换

    解题思路

    逐个执行变换。顺时针映射(i,j)到(j,h-1-i),逆时针到(w-1-j,i),旋转时新图宽高交换。左右翻转反转各行,上下翻转反转行序。

    正确性说明

    依题目给出的对应关系逐项处理,位置与原输入保持明确对应。每一步完成当前项的全部贡献,结束后得到所有位置或字符的目标结果。

    易错点

    每次旋转都要读取当前高度和宽度,不使用最初尺寸。

    复杂度

    k次操作、像素P,时间O(kP),空间O(P)。

    参考代码(C++11)

    #include <bits/stdc++.h>
    using namespace std;
    
    int main() {
        ios::sync_with_stdio(false);
        cin.tie(nullptr);
        int h, w;
        cin >> h >> w;
        vector<vector<int>> a(h, vector<int>(w));
        for (auto &r : a)
            for (int &x : r)
                cin >> x;
        string s;
        cin >> s;
        for (char op : s) {
            h = a.size();
            w = a[0].size();
            if (op == 'C') {
                for (auto &r : a)
                    reverse(r.begin(), r.end());
            } else if (op == 'D')
                reverse(a.begin(), a.end());
            else {
                vector<vector<int>> b(w, vector<int>(h));
                for (int i = 0; i < h; i++)
                    for (int j = 0; j < w; j++)
                        if (op == 'A')
                            b[j][h - 1 - i] = a[i][j];
                        else
                            b[w - 1 - j][i] = a[i][j];
                a.swap(b);
            }
        }
        for (auto &r : a) {
            for (size_t j = 0; j < r.size(); j++) {
                if (j)
                    cout << " ";
                cout << r[j];
            }
            cout << "\n";
        }
        return 0;
    }
    
    • 1

    信息

    ID
    420
    时间
    1000ms
    内存
    64MiB
    难度
    进阶
    标签
    递交数
    0
    已通过
    0
    上传者