#include <bits/stdc++.h>
using namespace std;
struct xyz {
int i,j;
int v;
}Triple;
struct xsjz{ // 存储系数矩阵
xyz data[100];
int mu,nu,tu;
}TsMatrix;
int oder[10][3] = {{1,2,12},{1,3,9},{3,1,-3},{3,6,14},{4,3,24},{5,2,18},{6,1,15},{6,4,-7},{7,2,8}}; // 原始数据
xsjz M,T;
void fastzz() // 快速转置
{
printf("------------------------------\n");
printf("转置\n");
int i,p,col,pos,cpot[10];
int num[10];
T.mu = M.mu; //行
T.nu = M.nu; // 列
T.tu = M.tu; // 数
for(i=1;i<=M.nu ; i++) num[i] = 0;
for(p=1;p<=M.tu ; p++)
num[M.data[p].j]++;//m每一列非零元的个数
cpot[1]=1;
for(col = 2; col <= M.nu ; col++)
cpot[col] = cpot[col-1] + num[col-1];//col列第一个非零元的编号
for(p = 1; p <= M.tu ; p++)
{
col = M.data[p].j;
pos = cpot[col];
T.data[pos].i = M.data[p].j;
T.data[pos].j = M.data[p].i;
T.data[pos].v = M.data[p].v;
++cpot[col]; //该列下一个元素
}
}
int mp[100][100],a[100][100],b[100][100];
void qiuhe()
{
printf("------------------------------\n");
printf("求和\n");
for(int i=1;i<=M.tu;i++)
{
a[M.data[i].i][M.data[i].j] = M.data[i].v;
b[T.data[i].i][T.data[i].j] = T.data[i].v;
}
printf("A\n");
for(int i=1;i<=M.nu;i++)
for(int j=1;j<=M.mu;j++)
{
printf("%5d",a[i][j]);
if(j==M.mu)printf("\n");
}
printf("B\n");
for(int i=1;i<=M.nu;i++)
for(int j=1;j<=M.mu;j++)
{
printf("%5d",b[i][j]);
if(j==M.mu)printf("\n");
}
printf("C\n");
for(int i=1;i<=M.nu;i++)
for(int j=1;j<=M.mu;j++)
{
mp[i][j]=a[i][j]+b[i][j];
printf("%5d",mp[i][j]);
if(j==M.mu)printf("\n");
}
}
int main()
{
int i,j,k;
M.mu = 7; //行
M.nu = 7; // 列
M.tu = 9; // 数
for( i = 0; i < M.tu; i++)
{
M.data[i+1].i = oder[i][0];
M.data[i+1].j = oder[i][1];
M.data[i+1].v = oder[i][2];
}
for(i=1;i<=M.tu ;i++)
{
printf("%d %d %d\n",M.data[i].i ,M.data[i].j,M.data[i].v );
}
fastzz();
for(i=1;i<=T.tu ;i++)
{
printf("%d %d %d\n",T.data[i].i ,T.data[i].j,T.data[i].v );
}
qiuhe();
}