Demo entry 6682437

121

   

Submitted by 121 on Dec 08, 2017 at 14:48
Language: C. Code size: 4.4 kB.

#include <stdio.h>
#define N 5
int M=4;
void Fill_array(int Array[M][N]){             //输入矩阵元素
    printf("请输入元素:");
    printf("\n");
    int i=0,j=0;
    for(i=0;i<M;i++){
        for(j=0;j<N;j++){
            scanf("%d",&Array[i][j]);
        }
    }
}
int Search(int B[N],int m){                   //查找B[N]中是否有m元素,为下面函数的辅助函数
    int res=0;
    int i=0;
    for(i=0;i<N;i++){
        if(B[i]==m)res=1;
    }
    return res;
}
int repeat(int a_row[N],int n){               //下一函数的辅助函数,判断一行中的第n个数有没有被统计
    int r=0,i=0;
    for(i=0;i<n;i++){
        if(a_row[i]==a_row[n])r=1;
    }
    return r;
}
int Firstrow_traversal(int a_row[N]){        //对一行将有效元素提前,重复元素放最后,返回重复元素个数
    int m=0;
    int i=0,j=0;
    for(i=0;i<N;i++){
        if(a_row[i]==0)m++;
    }
    if(m!=0)m--;
    int B[N]={0};
    for(i=0;i<N-1;i++){
        if(Search(B,a_row[i])==0){
            for(j=i+1;j<N;j++){
                if(a_row[i]==a_row[j]&&a_row[i]!=0)m++;
            }
            B[i]=a_row[i];
        }
    }
    int C[N]={0};
    C[0]=a_row[0];
    for(i=1,j=1;(i<N)&&(j<N);j++){
        if(repeat(a_row,j)==0){
            C[i]=a_row[j];
            i++;
        }
    }
    for(i=N-m;i<N;i++)C[i]=C[i-1];
    for(i=0;i<N;i++)a_row[i]=C[i];
    return m;
}
void Firstprepare_work(int Array[M][N],int I[M]){                //对矩阵每一行将有效元素提前,重复元素放最后,返回重复元素个数
    int i=0;
    for(i=0;i<M;i++)I[i]=0;
    for(i=0;i<M;i++)I[i]=Firstrow_traversal(&Array[i-1][N]);
}
void Firsttime_move_array(int Array[M][N],int I[M]){             //第一次整体删除所有重复元素,剩下元素前移补位
    Firstprepare_work(Array,I);
    int i=0,j=0;
    while(I[i]==0&&i<M)i++;
    for(i=i;i<M-1;i++){
        for(j=0;j<I[i]&&j<N;j++) Array[i][N-I[i]+j]=Array[i+1][j];
        for(j=0;j<N-I[i];j++) Array[i+1][j]=Array[i+1][j+I[i]];
        I[i+1]=I[i]+I[i+1];
        if(I[i+1]>=N&&i+1!=M-1){
            int m=0,n=0;
            for(m=i+1;m<M-1;m++){
                for(n=0;n<N;n++){
                    Array[m][n]=Array[m+1][n];
                    I[m]=I[m+1];
                }
            }
            M--;
        }
    }
    if(I[M-1]>=N)M--;
    else if(I[M-1]<N){
        for(i=N-I[M-1];i<N;i++) Array[M-1][i]=Array[M-1][i-1];
    }
}
int Nextrow_traversal(int a_row[N]){                              //返回一行的重复元素个数
    int m=0;
    int i=0,j=0;
    for(i=0;i<N;i++){
        if(a_row[i]==0)m++;
    }
    if(m!=0)m--;
    int B[N]={0};
    for(i=0;i<N-1;i++){
        if(Search(B,a_row[i])==0){
            for(j=i+1;j<N;j++){
                if(a_row[i]==a_row[j]&&a_row[i]!=0)m++;
            }
            B[i]=a_row[i];
        }
    }
    return m;
}
void Nextprepare_work(int Array[M][N],int I[M]){                  //对矩阵每一行统计重复元素个数
    int i=0;
    for(i=0;i<M;i++)I[i]=0;
    for(i=0;i<M;i++)I[i]=Nextrow_traversal(&Array[i-1][N]);
}
void Nexttime_move_array(int Array[M][N],int I[M]){              //第二次逐行删除重复元素,下面所有元素前移
    Nextprepare_work(Array,I);
    int i=0,j=0,k=0;
    for(i=0;i<M-1;i++){
        while(I[i]!=0&&i!=M-1){
            Firstrow_traversal(&Array[i-1][N]);
            for(j=i;j<M-1;j++){
                for(k=0;k<I[i]&&k<N;k++) Array[j][N-I[i]+k]=Array[j+1][k];
                for(k=0;k<N-I[i];k++) Array[j+1][k]=Array[j+1][k+I[i]];
                I[j+1]=I[j+1]+I[i];
                if((I[j+1]>=N)&&(j+1!=M-1)){
                    int m=0,n=0;
                    for(m=0;m<M-1;m++){
                        for(n=0;n<N;n++){
                            Array[m][n]=Array[m+1][n];
                            I[m]=I[m+1];
                        }
                    }
                    M--;
                }
            }
            if(I[M-1]>=N)M--;
            Nextprepare_work(Array,I);
        }
    }
    Firstprepare_work(Array,I);
}
void Print_array(int Array[M][N],int I[M]){                     //输出结束后数组内的有效元素
    int i=0,j=0;
    printf("查重结果为:");
    printf("\n");
    for(i=0;i<M-1;i++){
        for(j=0;j<N;j++){
            printf("%d ",Array[i][j]);
        }
        printf("\n");
    }
    for(i=0;i<N-I[M-1];i++){
        printf("%d ",Array[M-1][i]);
    }
    printf("\n");
}
int main(void){
    int Array[M][N];
    int I[M];
    Fill_array(Array);
    Firsttime_move_array(Array,I);
    Nexttime_move_array(Array,I);
    Print_array(Array,I);
    return 0;
}

This snippet took 0.02 seconds to highlight.

Back to the Entry List or Home.

Delete this entry (admin only).