100个python算法超详细讲解:猜牌术

100个python算法超详细讲解:猜牌术1 问题描述 魔术师利用一副牌中的 13 张黑桃 预先将它们排好后叠在一起 并使牌面 朝下 然后他对观众说 我不看牌 只要数数就可以猜到每张牌是什么 我大 声数数 你们听 不信你们就看 魔术师将从最上面的一张牌开始数 第一张 把它翻过来正好是黑桃 A

大家好,我是讯享网,很高兴认识大家。

1.问题描述
魔术师利用一副牌中的13张黑桃,预先将它们排好后叠在一起,并使牌面
朝下。然后他对观众说:我不看牌,只要数数就可以猜到每张牌是什么,我大
声数数,你们听,不信你们就看。魔术师将从最上面的一张牌开始数,第一张
把它翻过来正好是黑桃A,他将黑桃A放在桌子上,然后按顺序从上到下数手
中的余牌,第二次数1、2,将第一张牌放在这叠牌的下面,将第二张牌翻过
来,正好是黑桃2,也将它放在桌子上,第三次数1、2、3,将前面两张依次放
在这叠牌的下面,再翻第三张牌正好是黑桃3,这样依次进行,将13张牌全部
翻出来,准确无误。问魔术师手中的牌原始次序是怎样安排的?
2.问题分析
先根据题目描述来分析题意。题目中描述的内容比较多,但已经将魔术师
出牌的过程描述得很清楚了。
假设桌子上有13个空盒子排成一圈,设定其中一个盒子序号为1,将黑桃A
放入1号盒子中,接着从下一个空盒子开始重新计数,当数到第2个空盒子时,
将黑桃2放入其中。然后再从下一个空盒子开始重新计数,数到第3个空盒子
时,将黑桃3放入其中,这样依次进行下去,直到将13张牌全部放入空盒子中
为止。需要注意的是,在计数过程中要跳过那些已放入牌的盒子,而只对空盒
子计数。最后牌在盒子中的顺序就是魔术师手中牌的顺序。
3.算法分析
根据问题分析,使用循环结构来实现程序。使用程序将分析过程模拟出
来,就可以计算出魔术师手中的牌的原始次序。由于有13张牌,因此显然要循
环13次,每次循环时找到与牌序号对应的那个空盒子,因此循环体完成的功能
就是找到对应的空盒子将牌存入。
4.确定程序框架
先定义数组a[14]用于存放13张牌,即相当于问题分析中假定的盒子。
定义变量i、j和n,其中i表示牌的序号,j表示数组的下标(盒子的序
号),n用来记录当前的空盒序号,初值为1。
程序的主体结构为for循环语句,在for循环中实现将13张牌放入数组a的功
能。
1)程序主框架如下:

#外循环13次,每次将一张牌放入空盒中 for i in range(1, 14): # i表示牌的序号 # n用来记录当前的空盒序号,初值为1 n = 1 # 每次都从一个空盒开始重新计数 while n <= i: # 如果盒子非空,继续找下一个盒子 # 如果盒子为空,判断盒子序号与牌的序号是否相同,相同则存入,不同则继续找

讯享网
讯享网while n <= i: if j > 13: j = 1 if a[j]: # 盒子非空,跳过该盒子 j += 1 else: if n == i: # 判断该盒子是否为第i个空盒 a[j] = i # 是则将i存入 j += 1 n += 1

程序流程图如图2.15所示。


讯享网

#!/usr/bin/python3 # -*- coding: utf-8 -*- # @author : liuhefei # @desc: 猜牌术 if __name__ == '__main__': a = [0] * 14 # 初始化列表,用来存放13张牌 j = 1 # j是数组的下标,空盒子的序号 print("魔术师手中的牌原始次序是:") # 外循环13次,每次将一张牌放入空盒中 for i in range(1, 14): # i表示牌的序号 # n用来记录当前的空盒序号,初值为1 n = 1 # 每次都从一个空盒开始重新计数 while n <= i: if j > 13: j = 1 if a[j]: # 盒子非空,跳过该盒子 j += 1 else: if n == i: # 判断该盒子是否为第i个空盒 a[j] = i # 是则将i存入 j += 1 n += 1 print(a[1:])

6.运行结果
在PyCharm下运行程序,结果如图2.16所示。由输出结果可知,魔术师手
中的牌的原始次序是1,8,2,5,10,3,12,11,9,4,7,6,13。

 

小讯
上一篇 2025-02-15 07:50
下一篇 2025-03-24 12:29

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/27367.html