//可能有用的性质:0*0!+1*1!+2*2!+3*3!+4*4!+5*5!+6*6!+7*7!+8*8!= 9!-1
int fac[10]={1,1,2,6,24,120,720,5040,40320,362880}; // 阶乘
int KT(int arr[]){
int sum=0;
for(int i=0;i<n;i++){ // n表示有几位,八数码问题里n=9
int cnt=0;
for(int j=i+1;j<n;j++)
if(arr[j]<arr[i]) cnt++;
sum+=cnt*fac[n-1-i];
}
return sum;
}
bool vis[9];
void reKT(int ans[],int x){ // x为编码
memset(vis,false,sizeof(vis));
for(int i=0;i<n;i++){
int cnt=x/fac[n-1-i];
x%=fac[n-1-i];
for(int j=0;j<n;j++){
if(!vis[j]){
if(cnt==0){
ans[i]=j;
vis[j]=true;
break;
}
cnt--;
}
}
}
}
康托展开
最新推荐文章于 2019-05-29 14:24:38 发布