1. 程式人生 > >資料結構之特殊矩陣的逆向轉換

資料結構之特殊矩陣的逆向轉換

說明:

特殊矩陣的逆向轉換是指給你一個一維陣列,讓你轉換成特殊矩陣的形式,並輸出。

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

一、對稱矩陣

程式碼

#include<iostream>
using namespace std;
#define N 20
int a[N*(N+1)/2];
int matrix[N][N];
int n;
void Transform(){
    int i=0,j=0,k=0;
    for(;k<n*(n+1)/2;k++){
        matrix[i][j]=a[k];
        if(i==j) {i++;j=0;}
        else{
        	matrix[j][i]=a[k];
			j++;
		} 
    }
}
int main(){
    cout<<"請輸入對稱矩陣的邊長: ";
    cin>>n;
    cout<<endl<<"請輸入"<<n*(n+1)/2<<"個數:"<<endl;
    for(int i=0;i<n*(n+1)/2;i++) cin>>a[i];
    cout<<endl<<"對稱矩陣為:"<<endl;
    Transform();
    bool flag=1; 
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            if(flag){
               cout<<matrix[i][j];
               flag=0;
            }
            else cout<<' '<<matrix[i][j];
        }
        flag=1;
        cout<<endl;
    }
    return 0;
}

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

二、三角矩陣

三角矩陣分上下兩種三角矩陣,上三角矩陣如上圖所示,下三角矩陣反之。
程式碼

#include<iostream>
using namespace std;
#define N 20
int a[N*(N+1)/2];
int matrix[N][N];
int n,c;
void Upper(){
    int i=0,j=0,k=0;
    for(;k<n*(n+1)/2;k++){
        matrix[i][j]=a[k];
        if(i==j) {i++;j=0;}
        else{
        	matrix[j][i]=c;
			j++;
		} 
    }
}
void Lower(){
	int i=0,j=0,k=0;
    for(;k<n*(n+1)/2;k++){
        matrix[i][j]=a[k];
        if(j==n-1) {i++;j=i;}
        else j++;
        if(i!=j) matrix[j][i]=c;
    }
} 
int main(){
    cout<<"請輸入三角矩陣的邊長: ";
    cin>>n;
    cout<<endl<<"請輸入"<<n*(n+1)/2<<"個數:"<<endl;
    for(int i=0;i<n*(n+1)/2;i++) cin>>a[i];
    cout<<"請輸入常數c:";
    cin>>c;
    a[n*(n+1)/2]=c;
    bool flag=1; 
    cout<<endl<<"上三角矩陣為:"<<endl;
    Upper();
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            if(flag){
               cout<<matrix[i][j];
               flag=0;
            }
            else cout<<' '<<matrix[i][j];
        }
        flag=1;
        cout<<endl;
    }
    cout<<"下三角矩陣為:"<<endl;
    Lower();
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            if(flag){
               cout<<matrix[i][j];
               flag=0;
            }
            else cout<<' '<<matrix[i][j];
        }
        flag=1;
        cout<<endl;
    }
    return 0;
}

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

三、三對角矩陣

三角矩陣相對複雜,情況多樣,這裡列舉三對角矩陣,如下圖所示:

程式碼

#include<iostream>
using namespace std;
#define N 20
int a[N*(N+1)/2];
int matrix[N][N];
int n;
void Transform(){
    int i=0,j=0,k=0;
    for(;k<n*3-2;k++){
        matrix[i][j]=a[k];
        if(i==0&&j==1) {i++;j=0;}
        else j++;
        if(j==i+2) {i++;j=i-1;}
    }
}
int main(){
    cout<<"請輸入三對角矩陣的邊長: ";
    cin>>n;
    cout<<endl<<"請輸入"<<n*3-2<<"個數:"<<endl;
    for(int i=0;i<n*3-2;i++) cin>>a[i];
    cout<<endl<<"三對角矩陣為:"<<endl;
    Transform();
    bool flag=1; 
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            if(flag){
               cout<<matrix[i][j];
               flag=0;
            }
            else cout<<' '<<matrix[i][j];
        }
        flag=1;
        cout<<endl;
    }
    return 0;
}