全排列的編碼與解碼

2022-09-06 15:30:22 字數 454 閱讀 4036

看《演算法競賽入門經典》 第七章, 隱式圖的遍歷,八數碼一題。

學到了全排列的編碼與解碼。

用處: 每乙個排列代表乙個圖的狀態, 比如 8,3,2,4,5,6,7,0,1

表示成圖就是

8  3  2

4  5  6

7  0  1

我們將0~8的全排列和0~9!一一對映起來。

比如0, 1, 2, 3, 4, 5, 6, 7, 8 對應的就是0, 因為是第乙個排列組合

那麼8 7 6 5 4 3 2 1 0 對應的就是9!,因為是最後一種排列組合。

演算法實現如下:

int fact[9

]; //假設排列組合範圍是0~8

void init()

int transfer(int

ar[9])

return code;

}

全排列的編碼與解碼 康托展開

對於乙個集合 很明顯它有n 種全排列,把它們全都按照字典序排好序 從小到大 對應順序,假如問你第x個全排列是什麼,或者某個全排列在其中的序號是多少,可以利用康拓展開式來求。康托展開式 x a n n 1 a n 1 n 2 a i i 1 a 2 1 a 1 0 康托展開可以實現按字典序排序的序列與...

全排列的編碼與解碼 康托展開

康托展開 全排列到乙個自然數的雙射 x an n 1 an 1 n 2 ai i 1 a2 1 a1 0 ai為整數,並且0 ai適用範圍 沒有重複元素的全排列 二 全排列的編碼 的排列總共有n 種,將它們從小到大排序,怎樣知道其中一種排列是有序序列中的第幾個?如 按從小到大排列一共6個 123 1...

全排列的編碼與解碼 康托展開

康托展開是乙個全排列到乙個自然數的對映,可以快速求出乙個全排列在所有全排列中字典序排第幾 large x a n n 1 a n 2 a 1 0 其中 a i 表示全排列中後i個元素,第n i 1個元素排第幾 然後要減一 a i i 1 表示所有全排列中前n i個元素與當前全排列相同,且第n i 1...