1 条题解
-
0
练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