三元組的快速轉置
標準輸入輸出
題目描述:
使用快速轉置算法實驗三元組的轉置。
輸入:
輸入包含若干個測試用例,每個測試用例第一行爲兩個正整數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;
}
}