数组相关-4*4数组转置-z字形编排

======4*4数组转置======

#include<iostream>
using namespace std;
int main(int argc,char** argv){
	int a[4][4]={{0,1,2,3},{4,5,6,7},{8,9,10,11},{12,13,14,15}};
	int i=0;
	int j=0;
	int tmp=0;
	
	for(i=0;i<4;i++){
		for(;j<4;j++){
			tmp=a[i][j];
			a[i][j]=a[j][i];
			a[j][i]=tmp;
		}
		j=i+1;
	}
	for(i=0;i<4;i++){
		for(j=0;j<4;j++){
			cout<<a[i][j]<<"\t";
		}
		cout<<endl;
	}
	return 0;
}

原数组:

  0   1   2   3 

  4   5   6   7

  8   9 10 11 

12 13 14 15 

转换后数组:

0  4    8   12

1  5    9   13

2  6   10  14

3  7   11  15

即把i和j互换,沿主对角线(左上角到右下角)元素互换。

====沿次对角线(右上角到左下角)元素互换===

#include<iostream>
#include<iomanip>
using namespace std;
int main(int argc,char** argv){  //沿次对角线元素互换 
int a[4][4]={{0,1,2,3},{4,5,6,7},{8,9,10,11},{12,13,14,15}};
int i=0;
int j=0;
const int t_arr=3; //数组下标最大值 
int tmp=0;

for(i=0;i<3;i++){ //4变3 
for(j=0;j<3;j++){
//注意[1,1]与[2,2]被执行了两次
if(i>1&&i==j)
continue;
tmp=a[i][j];
a[i][j]=a[t_arr-j][t_arr-i];
a[t_arr-j][t_arr-i]=tmp;
}
}
for(i=0;i<4;i++){
for(j=0;j<4;j++){
cout<<a[i][j]<<“\t”;
}
cout<<endl;
}
return 0;

}

 

原数组:

  0   1   2   3 

  4   5   6   7

  8   9 10 11 

12 13 14 15 

转换后数组:

15 11  7  3
14 10  6  2
13  9   5  1
12  8   4  0

=====z字形编排=====

#include<iostream>
#include<iomanip>
using namespace std;
#define SIZE 8
int main(int argc,char** argv){
	int matrix[SIZE][SIZE]={0};    /*matrix矩阵*/
	int a[SIZE][SIZE]={0};
	int i,j,x,y,value=0;
	int * p;
	p=&matrix[0][0];	//初始化矩阵
	for(i=0;i<SIZE*SIZE;i++)
		*p++=i;
	cout<<"原始矩阵如下:"<<endl;
	for(i=0;i<SIZE;i++){
		for(j=0;j<SIZE;j++){
			cout<<setw(4)<<*(*(matrix+i)+j);
		}
		cout<<endl;
	}
	i=0,j=0;
	/*进行Z字形编排*/
	for(x=0;x<SIZE;x++){
		for(y=0;y<SIZE;y++){
			*(*(a+i)+j)=*(*(matrix+x)+y);//使用指针方法把matrix数组的值赋值给a数组
			if((i==0||i==7)&&j%2==0){
				j++;
				continue;
			} 
			if((j==0||j==7)&&i%2==1){
				i++;
				continue;
			}
			if((i+j)%2==0){
				i--;
				j++;
			}
			else if((i+j)%2==1){
				i++;
				j--;
			}
		}
	} 
	cout<<"经过Z字形编排的矩阵如下:"<<endl;
	for(i=0;i<SIZE;i++){
		for(j=0;j<SIZE;j++){
			cout<<setw(4)<<*(*(a+i)+j);
		}
		cout<<endl;
	}
	return 0;
}
Z字形规律:
1.如果二维数组中的元素matrix[i][j]中纵坐标j是偶数,且i=0或者i=7,那么遍历路径在矩阵中的走向就是水平向右移动一格(j++)。
if((i==0||i==7)&&j%2==0){j++;continue;} 
2.如果二维数组中的元素matrix[i][j]中横坐标i是奇数,且j=0或者j=0,那么遍历路径在矩阵中的走向就是水平向下移动一格(i++)。
if((j==0||j==7)&&i%2==1){i++;continue;}
3.除上述规则以外的情况,如果二维数组中的元素matrix[i][j]的横纵坐标和i+j是偶数,则遍历路径在矩阵中的走向就是右上角移动一格(i--;j++;);否则,若i+j是奇数,则遍历路径在矩阵中的走向就是左下角移动一格(i++;j--;)。
if((i+j)%2==0){
				i--;
				j++;
			}
			else if((i+j)%2==1){
				i++;
				j--;
			}

以下不用原始数组给新数组赋值,直接用一个变量:

#include<iostream>
#include<iomanip>
#define SIZE 8
using namespace std;
int main(){
	int arr[SIZE][SIZE]={0};
	int i,j,t=1;
	
		i=0,j=0;
		for(t=0;t<SIZE*SIZE;t++){
			arr[i][j]=t;
			if((i==0||i==7)&&j%2==0){
				j++;
				continue;
			} 
			if((j==0||j==7)&&i%2==1){
				i++;
				continue;
			}
			if((i+j)%2==0){
				i--;
				j++;
			}
			else if((i+j)%2==1){
				i++;
				j--;
			}
		}
		cout<<"经过Z字形编排的矩阵如下:"<<endl;
	for(i=0;i<SIZE;i++){
		for(j=0;j<SIZE;j++){
			cout<<setw(4)<<*(*(arr+i)+j);
		}
		cout<<endl;
	}
	return 0;
}

 

 

 

 

 

    原文作者:Z字形编排问题
    原文地址: https://blog.csdn.net/qq_41138935/article/details/79501397
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞