【模板】康拓展開+逆康拓展開

具體學習參考https://blog.csdn.net/lttree/article/details/24798653

康拓展開:

int  fac[] = {1,1,2,6,24,120,720,5040,40320}; //i的階乘爲fac[i]
// 康託展開-> 表示數字a是 a的全排列中從小到大排,排第幾
// n表示1~n個數  a數組表示數字。
int kangtuo(int n,char a[])
{
    int i,j,t,sum;
    sum=0;
    for( i=0; i<n ;++i)
    {
        t=0;
        for(j=i+1;j<n;++j)
            if( a[i]>a[j] )
                ++t;
        sum+=t*fac[n-i-1];
    }
    return sum+1;
}

逆康拓展開:

int  fac[] = {1,1,2,6,24,120,720,5040,40320};
//康託展開的逆運算,{1...n}的全排列,中的第k個數爲s[]
void reverse_kangtuo(int n,int k,char s[])
{
    int i, j, t, vst[8]={0};
    --k;
    for (i=0; i<n; i++)
    {
        t = k/fac[n-i-1];
        for (j=1; j<=n; j++)
            if (!vst[j])
            {
                if (t == 0) break;
                --t;
            }
        s[i] = '0'+j;
        vst[j] = 1;
        k %= fac[n-i-1];
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章