矩阵翻转、镜像

矩阵的翻转思想

顺时针:先将矩阵转置   再依次将各按中间的元素进行对称交换,一行只有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版权协议,转载请附上原文出处链接和本声明。