Python——魔术师发牌问题的Python实现

编程练习循环链表——魔术师发牌

问题名称:魔术师发牌问题

问题描述:

魔术师手里一共有13张牌,全是黑桃,1~13.

魔术师需要实现一个魔术:这是十三张牌全部放在桌面上(正面向下),

第一次摸出第一张,是1,翻过来放在桌面上。

第二次摸出从上往下数第二张,是2,翻过来 放在桌面上,(第一张放在最下面去,等会儿再摸),

第三次摸出从上往下数第三张,是3,翻过来放在桌面上,(第一张和第二张 放在最下面去,等会儿再摸)

以此类推 最后一张就是13

## 建立两个数组,类似于循环链表:
## 其中v_l数组存放要按发牌前顺序排放的数值,其初始化为任意值;
## 再建立一个l数组存放每次需要展示数值的地址,初始化为1:13;表示发牌前的排列顺序;并动态调整,如需要展示1时,则牌为1的地址为1,需要展示2的时候,则牌为2的地址为3

n = int(input("please input n:" ))  
v_l = [1]*n                        ## 初始化存储数值
l = list(range(1,n+1))             ## 初始化地址数值
i = 0                              ## 标记数数的次数,初始化为0
pos = 1                            ##  标记该次要展现的数值,初始化为1
## 循环取数,没进行一次,将地址数值L进行调整,使报过的地址放置在地址数值后面;若数数到了需要展现的数值时,则将该地址去掉,并将对应地址的v_lf赋值为pos
## 在大循环上,每次循环去掉地址数值的某个数,而该数表示的地址即为v_l的地址,其值即为第pos次要展示的数值
while len(l)>=1:        
    i = i+1
    if i == pos:
        v_l[l[0]-1] = pos
        l = l[1:]
        pos = pos+1
        i = 0
    else:
        temp = l[:1]
        l.extend(temp)
        l = l[1:]
print(str(n)+'张牌的排列顺序为' ,v_l)        
please input n:13
13张牌的排列顺序为 [1, 8, 2, 5, 10, 11, 12, 9, 4, 7, 6, 13]

你可能感兴趣的:(python算法)