#include #define maxsize 12500
typedef struct
{int iu;
int ju;
int e;
}triple;
typedef struct
{triple data[maxsize];
int m,n,ge;
}table;
int main()
{int m,n,i,j,x,ge;
int p,q,col,cpot[201]={0},num[201]={0};
ge=1;
table M,T;
scanf("%d%d",&m,&n);
for(i=1;i<=m;i++)
for(j=1;j<=n;j++)
{ scanf("%d",&x);
if(x!=0)
{M.data[ge].e =x;
M.data[ge].iu=i;
M.data[ge].ju=j;
ge++;
}
}
M.m=m;M.n=n;M.ge=ge;
T.m=M.n;
T.n=M.m;
T.ge=M.ge;
if(T.ge)
{for(p=1;p<=M.n;p++)
num[p]=0;
for(p=1;p<=M.ge;p++)
++num[M.data[p].ju]; //num数组计算第i列有几个非零元素
cpot[1]=1;
for(p=2;p<=M.n;p++)
cpot[p]=cpot[p-1]+num[p-1]; //cpot数组存储第i列第一个元素在转置后三元表的位置
for(p=1;p<=M.ge;p++)
{col=M.data[p].ju;
q=cpot[col];
T.data[q].e=M.data[p].e;
T.data[q].iu=M.data[p].ju;
T.data[q].ju=M.data[p].iu;
++cpot[col];
}
}
ge=1;
for(i=1;i<=T.m;i++)
{
for(j=1;j<=T.n;j++)
{if(T.data[ge].e&&(T.data[ge].iu==i)&&T.data[ge].ju==j)
{
printf("%d ",T.data[ge].e);
++ge;
}
else
printf("0 ");
}
printf("\n");
}
return 0;}