2019.6.24-2019.6.28(实训数据结构)3.数组编码求解问题

2019.6.24-2019.6.28(实训数据结构) 书籍:《数据结构项目实训教程》 赵君喆,戴文华

5.5数组与广义表项目实训拓展

设有一个数组 A:array[0..N-1],存放的元素为0~N-1(1<N<=10)之间的整数,且A[i]!=A[j],i!=j。

例如:当N=6时,有A=(4,3,0,5,1,2)。此时,数组A的编码定义如下:

A[0]编码:0。

A[i]编码wei:在A[0],A[1],...,A[i-1]中比A[i]的值小的个数(i=1,2,...N-1)。

则数组A的编码为B=(0,0,0,3,1,2)。

要求如下:

给出数组A,利用C求解A的编码。

给出数组A的编码后,求出A中的原数据。

#include<iostream>
#include<cstdio>
#include<conio.h>
#include<stdlib.h>
#include<time.h>
using namespace std;

int a[12],b[12];

void swap(int * x,int * y){
    int temp;
    temp = *x;
    *x = *y;
    *y = temp;
}
void fun(int N){
    srand(time(NULL));
    int i;
    for(i=0; i<N; ++i)
        a[i]=i;
    for(i=N-1; i>=1; --i) 
        swap(&a[i], &a[rand()%i]);
    printf("产生的随机数组是:\n");
    for(i=0; i<N; ++i)
        printf("%d ",a[i]);
    cout<<endl;
}

int main(){
    int n,m;
    printf("请输入n:\n");
    cin>>n;
    fun(n);
    for(int i=0;i<n;i++){
        int count=0;
        for(int j=0;j<i;j++){
            if(a[j]<a[i]){
                count++;
            }
        }
        b[i]=count;
    }
    printf("数组的编码分别是:\n");
    for(int i=0;i<n;i++){
        cout<<b[i]<<" ";
    }
    
    //解码 
    int d[n],f[n];
    int flag=0;
    //printf("\n请输入数组的编码:\n");
    /*for(int i=0;i<n;i++){
        cin>>m;
        c[i]=m;
    }*/
    for(int i=0;i<n;i++){
        d[i]=i;
    }
    for(int i=n-1;i>=0;i--){
        int count=0;
        for(int j=0;j<n;j++){
            if(d[j]==-1){
                count--;
            }    
            else if(b[i]==count){
                f[flag]=d[j];
                flag++;
                d[j]=-1;
                break;
            }
            count++;
        }
    }
    printf("\n请数组编码解码为:\n");
    for(int i=flag-1;i>=0;i--){
        cout<<f[i]<<" ";
    }
    return 0;
} 

猜你喜欢

转载自www.cnblogs.com/zhying99/p/11083822.html