编码、解码数组
大体思路:
编码十分简单,根据题意实现即可。解码较为复杂,需数组从后往前遍历实现。使用sign数组标记用过的数组,0为没用,1为用过。
#include<bits/stdc++.h>
using namespace std;
int n;int b[105];
void print(int*a)//输出数组
{
int i;
for (i = 0; i < n-1; i++)cout << a[i]<<" ";
cout << a[n - 1] << endl;
}
void lock(int*a)//编码
{
b[0] = 0; int i,j;
for (i = 1; i < n; i++)
{
for (j = 0; j < i; j++)if (a[j] < a[i])b[i]++;
}
print(b);
}
void delock(int*a)//解码
{
int i=0, j=0,k=0,cnt=0;
int sign[105] = {
0 };
for (i = n - 1; i >= 0; i--)
{
//cout << "i=" << i << endl;
j = 0; cnt = 0;
if (a[i] == 0)//如果前面没有更小的数字,则b[i]存第一个sign为0的数
{
for (k = 0; k < n; k++)
{
if (sign[k] == 0){
b[i] = k; break;}
}sign[k] = 1;
}
else
{
while (cnt < a[i])
{
if (sign[j] == 0)cnt++;// cout << "cnt=" << cnt << endl;
j++; //cout << "j=" << j << endl;
}