三元组的快速转置

三元组的快速转置
标准输入输出
题目描述:
使用快速转置算法实验三元组的转置。
输入:
输入包含若干个测试用例,每个测试用例第一行为两个正整数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;
	}
}


猜你喜欢

转载自blog.csdn.net/qq_36734025/article/details/78959809