给定一个n*n的矩阵matrix,请把这个矩阵顺时针转动90度。
输入描述
输入包含多行,第一行一个整数n(1≤n≤200),代表矩阵的行数和列数,接下来n行,每行n个整数,代表矩阵matrix(1≤matrix[i][j]≤40000)
输出描述:
输出旋转后的矩阵(包含n行,每行n个整数)
Sample Input
4
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
Sample Output
13 9 5 1
14 10 6 2
15 11 7 3
16 12 8 4
需要申请新矩阵存放转置后的矩阵,不能原地转置:
#include<iostream>
using namespace std ;
int main(void)
{
int n;
cin>>n;
int a[201][201],b[201][201];
for(int i=0;i<n;i++) //输入
{
for(int j=0;j<n;j++)
{
cin>>a[i][j];
}
}
for(int j=n-1;j>=0;j--) //转置
{
for(int i=0;i<n;i++)
{
b[i][j]=a[n-j-1][i];
}
}
for(int i=0;i<n;i++) //输出
{
for(int j=0;j<n;j++)
{
cout<<b[i][j]<<" ";
}
cout<<endl;
}
return 0;
}
原地转置:
#include<iostream>
#define N 201
using namespace std;
void turn(int arr[N][N],int a,int b,int c,int d)
{
int temp;
for(int i=0;i<d-b;i++)
{
temp=arr[a][b+i];
arr[a][b+i]=arr[c-i][b];
arr[c-i][b]=arr[c][d-i];
arr[c][d-i]=arr[a+i][d];
arr[a+i][d]=temp;
}
}
void func(int arr[N][N],int n) //按环状从外层到内层开始旋转
{
//从左上角至右下角往中心缩小
int a=0;
int b=0;
int c=n-1;
int d=n-1;
while(a<c)
{
turn(arr,a++,b++,c--,d--);
}
}
int main(void)
{
int n;
cin>>n;
int a[N][N];
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
cin>>a[i][j];
}
}
func(a,n);
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
cout<<a[i][j]<<" ";
}
cout<<endl;
}
return 0;
}