======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;
}