2020年4月10日 星期五

[C_MM217-中] 第K個重排

[C_MM217-中] 第K個重排

成績: 0 / 倒扣: 0.8
問題描述 :
1到NN個正整數,這N個正整數排成一列共有N!排法,這N!個重排依字典排序法從小到大排列編號。第一號為「1 2 3 … N」,第N!號為「N N-1 N-2 … 1」。以下為N=3時的狀況。
順序重排
11 2 3
21 3 2
32 1 3
42 3 1
53 1 2
63 2 1
現在輸入兩個數字NK,試求在1到N的重排中,排第K個的是誰。
輸入說明 :
輸入兩個正整數NK,用空白隔開,0 < N < 25。
輸出說明 :
輸出1到N的重排中,排第K個的重排。輸出時,各數字中間請用空排隔開,兩旁不留空白。
範例 :

輸入範例輸出範例
3 32 1 3

while True:
    try:
        N, K = map(int,input().split())
        def rot(data, n):               # 將第n個搬到最後
            val = data.pop(n)
            data.append(val)
            return data
        def rot_n_chk(data, n):         # 檢查第n個要不要搬
            for i in range(n-1):
                if data[i] == i:
                    rot(data, i+1)
                else:
                    break
            return data
        def chk_stop(data, n):          # 檢查所有的位置是否都歸位
            res = 1
            for i in range(n):          # 只要第i位置對 chk=1, 位置不對 chk=0
                chk=1 if data[i] == i else 0
                res *= chk              # 每位的乘積
            return res                  # res乘積為1表示全歸位都輪完了
        
        #data = [i for i in range(1, N+1)]   #[1, 2, 3...]
        data_i = [i for i in range(N)]      #[0, 1, 2...]
        data_p = []
        while True:
            rot(data_i, 0)
            rot_n_chk(data_i, N)
            #print(num, odata)
            b = data_i[:]
            data_p.append(b)
            if chk_stop(data_i, N):break
        r = sorted(data_p)
        #print(r[K-1])
        strs = ''
        for i in r[K-1]:
            strs += str(i+1) + ' '
        print(strs.strip())
    except(EOFError):
        break

沒有留言:

張貼留言