int fac[]={1,1,2,6,24,120,720,5040,40320,362880};//...
int cantor(int A[])
{
int i,j,temp,num;
num=0;
for (i=0;i<8;i++)
{
temp=0;
for (j=i+1;j<=8;j++)
if (A[j]<A[i])
temp++;
num+=fac[8-i]*temp;
}
return num+1;
}
void inv_cantor(int k)
{
int i,j,temp,visited[10]={0};
k--;
for (i=0;i<9;i++)
{
temp=k/fac[8-i];
for (j=1;j<=9;j++)
if (!visited[j])
{
if (temp==0)
break;
temp--;
}
s[i]=j;
visited[j]=1;
k%=fac[8-i];
}
}
康托展开与逆展开
最新推荐文章于 2023-07-23 11:23:35 发布