矩阵的翻转思想
顺时针:先将矩阵转置 再依次将各行按中间的元素进行对称交换,一行只有3个元素时为首尾互换
逆时针:先将矩阵转置 再依次将各列 按中间的元素进行对称交换,一列只有3个元素时为首尾互换
上下镜像:画个图就可以看出来相当于第一行和最后一行对换,第二行和倒数第二行对换,以此类推
#include <iostream>
#include<algorithm>
using namespace std;
//顺时针:先将矩阵转置 再依次将各行按中间的元素进行对称交换,一行只有3个元素时为首尾互换
//逆时针:先将矩阵转置 再依次将各列 按中间的元素进行对称交换,一列只有3个元素时为首尾互换
void transpose(int** a, int n,int ori){//ori表示顺时针还是你是猪,当ori为正是为顺时针,反之为逆时针
for(int i=0; i<n;i++)
for(int j=i+1; j<n;j++)
swap(a[i][j], a[j][i]);//转置
if(ori>0){//顺时针
for(int i = 0;i<n;i++){
for(int j=0;j<n/2;j++){
swap(a[i][j],a[i][n-j-1]);//行180°旋转
}
}
}
else if(ori<0){
for(int i = 0;i<n;i++){
for(int j=0;j<n/2;j++){
swap(a[j][i],a[n-j-1][i]);//目的在于将一列完全翻转,即180°旋转
}
}
}
}
//镜像
void image(int** a ,int size ,int ori){//ori>0时关于水平镜面,即上下镜面,反之为左右镜面
if(ori>0){
for(int i = 0;i<size/2;i++){
for(int j=0;j<size;j++){
swap(a[i][j],a[size-i-1][j]);
}
}
}
else if(ori<0){
for(int i = 0;i<size;i++){
for(int j=0;j<size/2;j++){
swap(a[i][j],a[i][size-j-1]);
}
}
}
}
void outp(int **a ,int size){
for(int i=0;i<size;i++){
for(int j=0;j<size;j++){
cout<<a[i][j]<<" ";
}
cout<<endl;
}
}
int main(){
int n;
cin>>n;
int **a = new int*[n];
for(int i = 0;i<n;i++){
int * b =new int[n];
a[i] = b;
for(int k = 0;k<n;k++)cin>>a[i][k];
}
cout<<"first"<<endl;
outp(a,n);
cout<<"==============+90"<<endl;
transpose(a,n,1);
outp(a,n);
cout<<"==============-90"<<endl;
transpose(a,n,-1);
outp(a,n);
cout<<"==============上下镜像"<<endl;
image(a,n,1);
outp(a,n);
cout<<"==============左右镜像"<<endl;
image(a,n,-1);
outp(a,n);
return 0;
}
版权声明:本文为qhlpptdyfn原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。