题目:
把矩阵顺时针调整90°,要求额外空间复杂度为1。
#include<iostream>
#include<vector>
using namespace std;
//tr为左上角行,tc为左上角列,dr为右下角行,dc为右下角列,从最外圈开始进行操作
void rotateEdge(vector<vector<int>> &m, int tr, int tc, int dr, int dc)
{
int times = dc - tc;
int temp = 0;
for (int i = 0; i < times; i++)
{
temp = m[tr][tc + i]; //进行交换,四条边上的点换位置,画图尝试得出关系
m[tr][tc + i] = m[dr - i][tc];
m[dr - i][tc] = m[dr][dc - i];
m[dr][dc - i] = m[tr + i][dc];
m[tr + i][dc] = temp;
}
}
int main()
{
int n, m;
cin >> n >> m; //行和列
vector<vector<int>> num;
vector<int> a;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
int t;
cin >> t;
a.push_back(t);
}
num.push_back(a);
a.clear();
}
int tr = 0, tc = 0, dr = n-1, dc = n-1;
while (tr < dr) //每进行一次外圈交换就把圈往里推一格,当左上点列坐标与右下点列坐标相同时,所有都交换完成
{
rotateEdge(num, tr++, tc++, dr--, dc--);
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
cout << num[i][j]<<' ';
}
cout << endl;
}
return 0;
}