转置矩阵
Time Limit: 1000ms Memory limit: 32768K 有疑问?点这里^_^
题目链接:http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=1592
题目描述
把矩阵A的行换成相应的列,得到的新矩阵称为A的转置矩阵,记作A'或A。
给你一个矩阵,求它的转置矩阵。
输入
输入数据的第一行是两个正整数R和C(1<=R,C<=10),分别代表矩阵的行数和列数。接下来R行,每行C个空格隔开的整数。
输出
输出转置后的矩阵,每行中相邻的两个数用空格隔开。
示例输入
3 3 1 2 3 4 5 6 7 8 9
示例输出
1 4 7 2 5 8 3 6 9
提示
代码:
1 #include<iostream> 2 #include<string.h> 3 #include<string> 4 using namespace std; 5 struct vode 6 { 7 int i,j; 8 int date; 9 }; 10 struct node 11 { 12 int mu,nu,tu; 13 struct vode data[1000]; 14 }; 15 struct node M,T; 16 void zhuanzhi(); 17 int main() 18 { 19 M.tu=0; 20 T.tu=0; 21 cin>>M.mu>>M.nu; 22 int i,j,k; 23 for(i=1; i<=M.mu; i++) 24 for(j=1; j<=M.nu; j++) 25 { 26 int temp; 27 cin>>temp; 28 //if(temp!=0)//修改此处可以筛选掉date值为0的数 29 { 30 M.data[++M.tu].date=temp; 31 M.data[M.tu].i=i; 32 M.data[M.tu].j=j; 33 } 34 } 35 zhuanzhi(); 36 for(i=1;i<=T.tu;i++) 37 { 38 if(i%T.nu==0) 39 { 40 cout<<T.data[i].date<<endl; 41 } 42 else 43 cout<<T.data[i].date<<" "; 44 } 45 return 0; 46 } 47 void zhuanzhi()//快速转置算法 48 { 49 int col,p,t,q; 50 T.tu=M.tu; 51 T.mu=M.nu; 52 T.nu=M.mu; 53 int cpot[1000]={0},num[1000]={0}; 54 if(T.tu) 55 { 56 for(col=1;col<=M.nu;col++) 57 num[col]=0; 58 for(t=1;t<=M.tu;++t) 59 ++num[M.data[t].j]; 60 cpot[1]=1; 61 for(col=2;col<=M.nu;col++) 62 cpot[col]=cpot[col-1]+num[col-1]; 63 for(p=1;p<=M.tu;p++) 64 { 65 col=M.data[p].j; 66 q=cpot[col]; 67 T.data[q].i=M.data[p].j; 68 T.data[q].j=M.data[p].i; 69 T.data[q].date=M.data[p].date; 70 ++cpot[col]; 71 } 72 } 73 }