我一直试图编写一个程序,将矩阵顺时针或逆时针旋转90度,但我不知道怎么做,当我在网上查找它时。我看到很多就地解决方案并不是我原本打算做的。我的想法是创建另一个nxn矩阵,只是将值从一个矩阵复制到另一个矩阵。下面是代码:
#include<iostream>
#include<vector>
#include<stdio.h>
using namespace std;
vector<vector<int> > rotate(const vector<vector<int> > &v);
int main(){
vector<vector<int> > vec{{1,1,1},
{2,2,2},
{3,3,3}};
// original
for (int i = 0; i < vec.size(); i++) {
for (int j = 0; j < vec[0].size(); j++) {
cout << vec[i][j];
}
cout << "\n";
}
cout << "after rotation:\n";
// print matrix after rotation
vector<vector<int> > ans = rotate(vec);
for (int i = 0; i < ans.size(); i++) {
for (int j = 0; j < ans[0].size(); j++) {
cout << ans[i][j];
}
cout << "\n";
}
return 0;
}
vector<vector<int> > rotate(const vector<vector<int> > &v) {
vector<vector<int> > ans;
int height = v.size(), width = v[0].size();
for (int i = 0; i < height; i++) {
vector<int> row;
ans.push_back(row);
for( int j = 0; j < width; j++){
ans.at(i).push_back(0);
}
}
for(int i = 0; i <= height; i++) {
for(int j = 0; j < width; j++) {
//here i deleted my code because it didn't copy the value over correctly!
}
}
return ans;
}
我做了很多关于如何做矢量的研究(非常混淆了&amp;和东西)现在我一直在试图想出一种复制值的方法,并且进行了一些奇怪的旋转(不是90度),所以我删除了我所做的,希望你能给我一些关于该做什么的提示。
所以说顺时针旋转90度后我会有原始矩阵。
111 321
222 ==> 321
333 321
答案 0 :(得分:2)
所以你从矩阵看起来像:
然后您要使用i
和j
对其进行索引,以访问它的旋转版本:
因此,您可以看到i
从n
转到0
,j
从0
转到n
。 i
是x轴,j
是y轴。因为您使用[y][x]
索引到矩阵,所以最终得到如下内容:
vector<vector<int> > rotate(const vector<vector<int> > &v) {
int n = v.size();
// create nxn matrix
vector<vector<int> > ans(n, vector<int>(n));
// copy in the values rotated
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
ans[i][j] = v[j][n - i - 1];
}
}
return ans;
}
实例here
答案 1 :(得分:1)
111 321
222 ==> 321
333 321
观察当我们遍历第一个矩阵的第一行时,我们想要将111复制为次要矩阵的最后一列,并将222(第二行)复制为次要矩阵的倒数第二列等等。这样做的一种方法是:
for(int i = 0; i < width; i++) {
for(int j = 0; j < height; j++) {
ans[j][width-1-i] = v[i][j];
}
}
所以你有
ans[0][2] = v[0][0]
ans[1][2] = v[0][1]
ans[2][2] = v[0][2]
ans[0][1] = v[1][0]
.....