原矩阵——>压缩成3元组(可以用二维数组表示这个3元组)——>3元组的行列交换,其实是前面二维数组的第一列与第二列的交换——>交换后的矩阵第一列进行排序
#include<iostream>
using namespace std;const int ROW=3;
const int COL=4;
void print(int *,int len,int col );
void reduce(int a[ROW][COL]);
void change(int a[][3]);
void main()
{
int a[ROW][COL]=
{
{3,0,0,0},
{0,0,4,0},
{8,0,0,6}
};
int *p=&a[0][0];
cout<<"原数组为\n\n";
print(p,12,4);
reduce(a);
}
void print(int * p,int len,int col)
{
for(int i=0;i<len;i++)
{
cout<<*p++<<' ';
if((i+1)%col==0)
cout<<endl;
}
}
void reduce(int a[][COL])
{
int cut[4][3];
int m=0;
for(int i=0;i<ROW;i++)
for(int j=0;j<COL;j++)
{
while(a[i][j]!=0)
{
cut[m][0]=i;
cut[m][1]=j;
cut[m][2]=a[i][j];
m++;
break;
}
}
int *q=&cut[0][0];
cout<<"压缩数组为\n\n";
print(q,12,3);
change(cut);
}
void change(int a[][3])
{
for(int m=0;m<4;m++)
{
int tempp= a[m][0];
a[m][0]=a[m][1];
a[m][1]=tempp;
}
cout<<"转置数组为(未排序)\n\n";
int *w=&a[0][0];
print(w,12,3);
//冒泡排序
for(int i=0;i<4;i++)
for(int j=i;j<4-i-1;j++)
{
if(a[j][0]>a[j+1][0])
{
int t=a[j][0];
a[j][0]=a[j+1][0];
a[j+1][0]=t;
int temp=a[j][1];
a[j][1]=a[j+1][1];
a[j+1][1]=temp;
int tt=a[j][2];
a[j][2]=a[j+1][2];
a[j+1][2]=tt;
}
}
int *q=&a[0][0];
cout<<"转置数组为\n\n";
print(q,12,3);
}