康托展开

来源:互联网 发布:氯氟醚菊酯0.6% 知乎 编辑:程序博客网 时间:2024/05/14 20:56

给定排列,求其唯一映射的排列编号:

rank[a[1]]*(n-1)!+rank[a[2]]*(n-2)!....rank[a[n]]*(n-n)!

int Cantor(int a[]){int ans=0;for(int i=1;i<=n;i++){int cnt=0;for(int j=i+1;j<=n;j++)   if(a[i]>a[j])      cnt++;ans+=(cnt*ft[n-i]);}return ans+1;}


给定排列编号,还原排列:

void Anti(int x){cls(v);int t=x-1;for(int i=1;i<=n;i++){int k=t/ft[n-i],j;t=t%ft[n-i];for(j=1;j<=n;j++){if(!v[j]) k--;if(k==-1) break;}v[j]=1;printf("%d",j);}printf("\n");}



1 0
原创粉丝点击