三元组的快速转置
标准输入输出
题目描述:
使用快速转置算法实验三元组的转置。
输入:
输入包含若干个测试用例,每个测试用例第一行为两个正整数m,n表示稀疏矩阵的行数和列数,接下来m行,每行n个整数,表示稀疏矩阵元素。要求采用三元组存储,并使用普通转置方法实验三元组的逆置。
输出:
对每一测试用例,输出逆置后的三元组。
输入样例:
5 6
5 0 0 0 4 0
0 8 2 0 0 0
9 0 0 0 1 0
0 6 7 0 0 0
0 0 0 0 0 0
输出样例:
6 5 8
1 1 5
1 3 9
2 2 8
2 4 6
3 2 2
3 4 7
5 1 4
5 3 1
用index数组记录新三元表中旧三元表中列数为j的元素的起始位置
用num数组记录原三元表中列数为j的项数。
package easyProgram; import java.util.Scanner; /* 用index数组记录新三元表中旧三元表中列数为j的元素的起始位置 用num数组记录原三元表中列数为j的项数。 */ public class QuickTurn { public static void main(String[] args) { Scanner sc =new Scanner(System.in); int i,j,l=0;//l用于记录三元组元素个数 int n=sc.nextInt(); int m = sc.nextInt(); U[] old =new U[100]; U[] fresh = new U[100]; for(i=0;i<n;i++) { for(j=0;j<m;j++) { int c = sc.nextInt(); if(c!=0) { old[l++] = new U(i,j,c); } } } int[] num = new int[l]; int[] index = new int[l]; for(i=0;i<l;i++) { for(j=0;j<l;j++) { if(old[j].j == i) { num[i]++; } } } for(i=1;i<l;i++) { index[i]=index[i-1]+num[i-1]; } for(i=0;i<l;i++) { //原来的j列的对应的起始位置 fresh[index[old[i].j]] = new U(old[i].j,old[i].i,old[i].value); System.out.print((old[i].i+1)+" "+(old[i].j+1)+" "+old[i].value); System.out.print("<----------->"); System.out.println((fresh[index[old[i].j]].i+1)+" "+(fresh[index[old[i].j]].j+1)+" "+fresh[index[old[i].j]].value); index[old[i].j]++; } System.out.println(m+" "+n+" "+l); System.out.println("原三元组"); for(i=0;i<l;i++) { System.out.println((old[i].i+1)+" "+(old[i].j+1)+" "+old[i].value); } System.out.println("----------------------------------"); System.out.println("新三元组"); for(i=0;i<l;i++) { System.out.println((fresh[i].i+1)+" "+(fresh[i].j+1)+" "+fresh[i].value); } } } class U{ int i;//行号 int j;//列号 int value;//值 public U(int i,int j,int value) { this.i=i; this.j=j; this.value = value; } }