星星之火OIer 康拓 逆康拓展開

2021-09-23 22:10:51 字數 633 閱讀 6126

僅僅只是為了自己的另一篇部落格水了乙份

康托展開是指乙個全排列到乙個自然數的雙射,因為全排列是不重複的,所以也有逆康拓展開

在八數碼問題中,如果想法簡單一點,直接用陣列987654321來開,就算是bool型別也會爆

但是用康托展開對映後,最大只需要開到

令x為康托展開後的對應值

這裡的a[i]表示在i後面還有幾個比它本身小的值

注意,此處計算出來的x應為從0開始排的結果,如果習慣從1開始則還要+1

對於數列

我們用康托展開試一下

所以這個數列應該是全排的第51個

大家可以手推一下,也可以把資料換小一點驗證

還是用剛剛那個資料

康拓返回值是50

具體過程如下

il it cantor(ch s) {

memset(flag,1,sizeof(flag));

it ans=0,temp;

for(it i=0;i<9;i++) {

flag[s[i]-'0']=0;//已經掃過,後面就不必再計算了

temp=0;

for(it j=0;j逆康拓展開因為這道題裡不需要,作者就偷乙個懶,請大家自己想好辣

康拓展開 康拓逆展開

康拓展開 已知有一集合a包含n個不同的元素,其中 k1,k2,k3.kn 2 是a的乙個排列。假設此排列為a按字典序從小到大排列的排列中的第x個排列,則x a1 n 1 a2 n 2 an 2 1 an 1 0 其中ai為ki 1.kn中比ki小的數的個數 例如 3214是1234的第2 3 1 2...

康拓展開與康拓逆展開

x a n n 1 a n 1 n 2 a i i 1 a 1 0 其中a i 為當前未出現的元素中是排在第幾個 從0開始 這就是康托展開。公式把乙個整數x展開成如下形式 x a n n 1 a n 1 n 2 a i i 1 a 2 1 a 1 0 其中a i 為 當前元素 在 所有未出現的元素 ...

康拓展開和逆康拓展開

康托展開就是一種特殊的雜湊函式 把乙個整數x展開成如下形式 x a n n a n 1 n 1 a 2 2 a 1 1 其中,a為整數,並且0 a表示1,2,3,n的排列如 按從小到大排列一共6種,就是123 132 213 231 312 321 代表的數字 1 2 3 4 5 6 也就是把10進...