贴吧里有这样一个题目 下面楼主的补发:
这种魔术看起来是有魔术师有“读心术”? 实际上不然。 奥秘在于助手的出牌顺序,这背后有一套算法,展示后魔术师经过计算已经知道了最后一张牌的值(每张牌有一个编号),对应的可以找到隐藏的牌。
我的思路是这样的(这是编程设计算法的思路,查阅过一些资料总结的): 首先只有4种花色,抽5张牌,根据鸽巢原理(鸽洞原理),必定有重花色的情况出现。 然后一种花色只有13张牌,围成一个圈,最远的距离是6(双向可达)。 So,我们作如下规约:
- 藏匿的卡牌花色与第一张相同
- 藏匿卡牌的字面值与第一张相距在1~6之间(毕竟不能重复,0是不存在的)
- 1~6 的距离由第2张~第4张展示的牌的大小顺序呈现(按照编号而不是字面值)
- (小->中->大)= 1
- (小->大->中)= 2
- (中->小->大)= 3
- (中->大->小)= 4
- (大->小->中)= 5
- (大->中->小)= 6
- 编号顺序花色从Club(梅花)->Diamond(方片)->Heart(红心)->Spade(黑桃)
- 花色内部编号从小到大A->2->3->…->K(与斗地主不同啊)
- 依据先补满同字面值的花色再往后延伸字面值到K的顺序来编号
规约就是这样,然后就可以搞事情了嘿嘿嘿~~~
下面放出来Python描述的代码实现:
# 你可以读心术——随机抽取五张牌,其中一张隐藏起来,按照特定的顺序给四张牌,你就能知道第五张牌是什么!
# deck是一个字符串列表,每个字符串是一张卡。名单上卡片的顺序很重要!!
deck = ['A_C', 'A_D', 'A_H', 'A_S', '2_C', '2_D', '2_H', '2_S',
'3_C', '3_D', '3_H', '3_S', '4_C', '4_D', '4_H', '4_S',
'5_C', '5_D', '5_H', '5_S', '6_C', '6_D', '6_H', '6_S',
'7_C', '7_D', '7_H', '7_S', '8_C', '8_D', '8_H', '8_S',
'9_C', '9_D', '9_H', '9_S', '10_C', '10_D', '10_H', '10_S',
'J_C', 'J_D', 'J_H', 'J_S', 'Q_C', 'Q_D', 'Q_H', 'Q_S',
'K_C', 'K_D', 'K_H', 'K_S']
# 给5张牌,助手会藏一张合适的牌,TA仔细挑选了剩下的四张卡片,然后把它们读出来!
def AssistantOrderCards():
print('Cards are character strings as shown below.')
print('Ordering is:', deck)
# 初始化
cards, cind, cardsuits, cnumbers = [], [], [], []
numsuits = [0, 0, 0, 0]
# 将卡片作为用户/观众的输入
# 填写各种数据结构
for i in range(5):
print('Please give card', i + 1, end=' ')
card = input('in above format: ')
cards.append(card)
n = deck.index(card)
cind.append(n)
cardsuits.append(n % 4)
cnumbers.append(n // 4)
numsuits[n % 4] += 1
if numsuits[n % 4] > 1:
pairsuit = n % 4
# 从5个相同的套装中找出两张牌。保证存在
cardH = []
for i in range(5):
if cardsuits[i] == pairsuit:
cardH.append(i)
# 找出需要隐藏的卡和要编码的号码
hidden, other, encode = outputFirstCard(cnumbers, cardH, cards)
remindices = []
for i in range(5):
if i != hidden and i != other:
remindices.append(cind[i])
# 按升序排列这三张牌
sortList(remindices)
# 给定需要编码的号码,对卡片进行适当的排序
outputNext3Cards(encode, remindices)
return
# 这个程序可以根据距离隐藏哪张卡。两张牌之间有相同的套装。它返回隐藏卡、第一张暴露卡和距离。
def outputFirstCard(ns, oneTwo, cards):
encode = (ns[oneTwo[0]] - ns[oneTwo[1]]) % 13
if 0
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?