我在这里看到了几个问题,并不完全回答我的问题。我试图做一些经常在面试问题中使用的经典矩阵旋转问题的翻译。我没有关注方矩阵,而是对M×N矩阵感兴趣。如何将M×N矩阵180度旋转到位?
对于输入矩阵
1 2 3
4 5 6
7 8 9
1 2 3
我想矩阵变换成
3 2 1
9 8 7
6 5 4
3 2 1
这里是我写的代码:
#include <iostream>
#include <vector>
#include <algorithm>
void do_swaps(int& a, int& b, int& c, int& d) {
std::swap(a, b);
std::swap(c, d);
}
void rotate(std::vector<std::vector<int>>& v) {
size_t m = v.size();
size_t n = v[0].size();
for(size_t i = 0; i < m/2; ++i) {
for(size_t j = 0; j <= n/2; ++j) {
do_swaps(v[i][j], v[m-i-1][n-j-1], v[m-j-1][i], v[j][n-i-1]);
}
}
}
void print(const std::vector<std::vector<int>>& v) {
size_t m = v.size();
size_t n = v[0].size();
for(size_t i = 0; i < m; ++i) {
for(size_t j = 0; j < n; ++j) {
std::cout << v[i][j] << ' ';
}
std::cout << '\n';
}
}
int main() {
std::vector<std::vector<int>> m{{1,2,3}, {4,5,6}, {7,8,9}, {1, 2, 3}};
std::cout << "Before: \n";
print(m);
rotate(m);
std::cout << "\nAfter: \n";
print(m);
}
这是我的输出:
Before:
1 2 3
4 5 6
7 8 9
1 2 3
After:
3 2 1
9 5 7
6 8 4
3 2 1
我的代码适用于3 x 3矩阵(尚未测试更高维矩阵),但我似乎在代码中出现了一处错误,导致最内层元素保持未修剪状态。
在行for(size_t j = 0; j <= n/2; ++j) {
,我试着将停止条件调整为几件事情,包括j < (n+1)/2;
和j < (n-1)/2;
,但它仍然是一样的。
有人可以解释我的算法出错了吗?
这似乎并不一般。小心解释一下? – erip
1.你没有在中间翻转行 2.你在中间列上交换元素两次 – hedgie
它似乎对我的输入有效,但我仍然不完全理解代码的情况。如果你添加更多的解释,我会接受它。 – erip