欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Python实现扑克牌问题

程序员文章站 2024-02-27 19:26:27
...

扑克牌问题

有20张扑克牌,牌面上为数字1~20,正面朝下堆叠在一起,顺序未知。现在取走最上面一张牌为数字1,然后把其后面的1张牌放到牌堆的最下面,再取走最上面的牌为数字2,然后把其后面的2张牌依次一张一张放到牌堆的最下面,再取走最上面的牌为数字3,然后把其后面的3张牌依次一张一张放到牌堆的最下面。。。以此类推取出最后一张牌为20,那么请问最开始的这堆牌顺序是怎么样的?
(这里可能会有人疑惑,当取出最上面的一张牌为数字11时,牌库里还有9张牌,那么怎样把后面的11张牌放到牌堆的最下面呢?其实这里是一张一张往牌底下放的,所以放完9张之后,后面两张就是这9张中的第1,2张重复放啦)
Python实现扑克牌问题

思路
从放牌规则来看,抽数字1然后往后翻1次牌,抽数字2然后往后翻2次牌,抽数字3然后往后翻3次牌。。。抽数字18然后往后翻18次牌(其实就剩两张牌一直在轮换着放牌底下),抽数字19然后往后翻19次牌(其实就剩一张数字20的牌在,怎么翻都是它),抽20就不用翻了,没牌了。

清楚从前往后的顺序了,我们只要把这个过程倒推回去就可以得到最开始这堆牌的顺序了:先放数字20,然后往前翻19次牌,再把数字19放到最顶上,然后再往前翻18次牌,再把18放到最顶上。。。以此类推。

def get_list(poker):
    result = [poker]  # 先放数字20
    for p in range(poker-1, 0, -1):  # 倒序来遍历
        for _ in range(p):  # 翻几次
            flip(result)  # 往前翻
        result.insert(0, p)  # 翻转完了再把数字放到最顶上
    return result  # 最后修改后的列表就是最开始这堆牌的顺序

def flip(result):
    poker = result[-1]  # 取最后一个元素,赋值给变量
    del result[-1]  # 删除最后一个元素
    result.insert(0, poker)  # 把最后的元素放到最顶上


if __name__ == '__main__':
    poker = 20
    print(get_list(poker))

输出:

[1, 6, 2, 8, 16, 3, 17, 19, 14, 4, 13, 7, 20, 10, 5, 11, 9, 18, 15, 12]
相关标签: 小小算法 python