Python实现扑克牌问题
程序员文章站
2024-02-27 19:26:27
...
扑克牌问题
有20张扑克牌,牌面上为数字1~20,正面朝下堆叠在一起,顺序未知。现在取走最上面一张牌为数字1,然后把其后面的1张牌放到牌堆的最下面,再取走最上面的牌为数字2,然后把其后面的2张牌依次一张一张放到牌堆的最下面,再取走最上面的牌为数字3,然后把其后面的3张牌依次一张一张放到牌堆的最下面。。。以此类推取出最后一张牌为20,那么请问最开始的这堆牌顺序是怎么样的?
(这里可能会有人疑惑,当取出最上面的一张牌为数字11时,牌库里还有9张牌,那么怎样把后面的11张牌放到牌堆的最下面呢?其实这里是一张一张往牌底下放的,所以放完9张之后,后面两张就是这9张中的第1,2张重复放啦)
思路
从放牌规则来看,抽数字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]