如何用C++实现矩阵每列翻转 将[[1,2],[3,4]]转为[[3,4],[1,2]]
问题分析
你给出的转换需求[[1,2],[3,4]]→[[3,4],[1,2]]属于矩阵垂直翻转(上下翻转),是将矩阵的行顺序整体逆序,和你描述的「列翻转」表述有偏差,常规列翻转指左右翻转每一行,输出为[[2,1],[4,3]],以下按你给出的示例需求实现。
原代码存在的问题
- 逻辑完全错位:
rotaterow函数内下标使用混乱,固定操作第a=0行,交换的元素下标i、k、j没有对应到需要翻转的列/行位置,无法得到预期结果 - 全局变量
g多余且有害:既和传入的列参数j功能重复,还会引发不可预期的越界访问问题 - 函数调用逻辑错误:外层循环仅传入固定的
a=0,仅会操作第一行元素,无法实现全矩阵翻转
正确实现代码
方案1:直接交换行(最简实现)
不需要逐元素操作,直接交换整行即可实现需求,代码如下:
#include<bits/stdc++.h> using namespace std; int main() { int n; cin >> n; vector<vector<int>> matrix(n, vector<int>(n)); for(int i = 0; i < n; i++) { for(int j = 0; j < n; j++) { cin >> matrix[i][j]; } } // 翻转矩阵:交换第i行和第n-1-i行 for(int i = 0; i < n/2; i++) { swap(matrix[i], matrix[n-1 -i]); } for(int i = 0; i < n; i++) { for(int j = 0; j < n; j++) cout << matrix[i][j] << " "; cout << endl; } return 0; }
方案2:逐列翻转元素(符合你最初的逐列操作思路)
如果你希望按逐列操作的逻辑实现,代码如下:
#include<bits/stdc++.h> using namespace std; // 翻转第col列的元素 void rotateCol(vector<vector<int>>& matrix, int col) { int n = matrix.size(); for(int i = 0; i < n/2; i++) { swap(matrix[i][col], matrix[n-1 -i][col]); } } int main() { int n; cin >> n; vector<vector<int>> matrix(n, vector<int>(n)); for(int i = 0; i < n; i++) { for(int j = 0; j < n; j++) { cin >> matrix[i][j]; } } // 遍历每一列执行翻转 for(int j = 0; j < n; j++) { rotateCol(matrix, j); } for(int i = 0; i < n; i++) { for(int j = 0; j < n; j++) cout << matrix[i][j] << " "; cout << endl; } return 0; }
方案3:调用标准库函数
可以直接用STL的reverse函数实现行逆序,代码更简洁:
// 只需要把翻转部分替换为以下代码即可 reverse(matrix.begin(), matrix.end());
内容的提问来源于stack exchange,提问作者Deco Pinkman
相关产品推荐
相关产品推荐

