C++程序 将矩阵旋转45度
给定一个大小为 N*N 的矩阵 mat[][] ,任务是将矩阵旋转45度并打印矩阵。
例子:
输入: N = 6,
mat[][] = {{3, 4, 5, 1, 5, 9, 5},
{6, 9, 8, 7, 2, 5, 2},
{1, 5, 9, 7, 5, 3, 2},
{4, 7, 8, 9, 3, 5, 2},
{4, 5, 2, 9, 5, 6, 2},
{4, 5, 7, 2, 9, 8, 3}}
输出:
3
6 4
1 9 5
4 5 8 1
4 7 9 7 5
4 5 8 7 2 9
5 2 9 5 5
7 9 3 3
2 5 5
9 6
8
输入: N = 4,
mat[][] = {{2, 5, 7, 2},
{9, 1, 4, 3},
{5, 8, 2, 3},
{6, 4, 6, 3}}
输出:
2
9 5
5 1 7
6 8 4 2
4 2 3
6 3
3
方法: 按以下步骤解决问题:
- 使用计数器变量将对角线元素存储在列表中。
- 打印所需空格数,使输出呈现所需的模式。
- 反转列表元素后打印列表元素。
- 仅遍历对角线元素以优化操作所需的时间。
以下是上述方法的实现:
#include <bits/stdc++.h>
using namespace std;
void matrix(int n, int m, vector<vector<int>> li)
{
int ctr = 0;
while (ctr < 2 * n - 1)
{
for(int i = 0;
i < abs(n - ctr - 1);
i++)
{
cout << " ";
}
vector<int> lst;
for(int i = 0; i < m; i++)
{
for(int j = 0; j < n; j++)
{
if (i + j == ctr)
{
lst.push_back(li[i][j]);
}
}
}
for(int i = lst.size() - 1; i >= 0; i--)
{
cout << lst[i] << " ";
}
cout << endl;
ctr += 1;
}
}
int main()
{
int n = 8;
int m = n;
vector<vector<int>> li{
{ 4, 5, 6, 9, 8, 7, 1, 4 },
{ 1, 5, 9, 7, 5, 3, 1, 6 },
{ 7, 5, 3, 1, 5, 9, 8, 0 },
{ 6, 5, 4, 7, 8, 9, 3, 7 },
{ 3, 5, 6, 4, 8, 9, 2, 1 },
{ 3, 1, 6, 4, 7, 9, 5, 0 },
{ 8, 0, 7, 2, 3, 1, 0, 8 },
{ 7, 5, 3, 1, 5, 9, 8, 5 } };
matrix(n, m, li);
return 0;
}
输出:
时间复杂度: O(N 2 )
辅助空间: O(N),因为使用了向量的辅助空间