Python编程算法【十七】 猜牌术
【案例内容】
魔术师利用一副牌中的13张黑桃,预先将它们排好后叠在一起,并且牌面朝下。对观众说:我不看牌,只要数数就可以猜到每张牌是什么,请看:魔术师将最上面的那张牌数为1,把它翻过来正好是黑桃A,并将黑桃A放在桌子上,然后按顺序从上到下数手上的余牌,第二次数1、2,将第一张牌放在这叠牌的下面,将第二张牌翻过来,正好是黑桃2,也将它放在桌上,第三次数1、2、3,将前面两张依次放在这叠牌的下面,把第三张牌翻过来正好是黑桃3。按此方式依次将13张牌全翻出来,准确无误。问魔术师手中的牌原始顺序是怎样摆放的?
【解题思路】
从程序角度分析,可设两个数组,第一个数组存储13个数字0,代表13个空位,一会用它来存放13张扑克牌的位置,比如 position = [0 for i in range(13)] 。第二数组存储13张扑克牌,用数字1-13代表扑克牌中的A-K,比如 cards = [i for i in range(1, 14)]。接着我们手动模拟摆放一下扑克牌的位置,根据题意,前四张扑克牌即1-4的摆放位置如下:
1,0,2,0,0,3,0,0,0,4,0,0,0
0表示空位,当继续摆放5的时候,应从数字4后面的第一个0开始,数5位,数到尽头时再从左侧的数字0继续数到5位为止,那么数字5的摆放位置如下:
1,0,2,5,0,3,0,0,0,4,0,0,0
以此类推,数字6,就从数字5后面的第一个0开始,数6位,并跳过非0的数字,摆放如下:
1,0,2,5,0,3,0,0,0,4,0,6,0
按照上述的方式,把全部的数字摆放完毕。
经观察发现,扑克牌的数字,就是每次循环的次数,比如当数字2摆定后,需循环3次后,放置数字3;同理数字3摆定后,需循环4次后,放置数字4。此外,当下标到达尽头,即下标为12时,应从头开始,即下标从0开始数。另外,循环数数的时候要跳过非0数字。
【Python代码】

本题的逻辑思路相对比较复杂,既要考虑循环,还要考虑下标,同时在循环时,还要跳过非0的数字。从本题中也可以看出,编程可以用来解决日常生活问题,其实它早已广泛应用于我们的生产生活中,与我们的日常生活息息相关,密切联系。