1)取两副纸牌去除大小王,共104张,其中▲表示黑桃,○表示红心,★表示梅花,◇表示方块,将牌按顺序叠好,成为原始牌叠;
2)对原始牌叠洗牌:进行104次洗牌,每次将面上的第一张牌随机插在牌叠中,成为洗牌牌叠;
3)摸牌:从洗牌牌叠中从上向下连续摸牌,使得摸到的牌里没有重复的牌(同花色、同点数视为重复的牌),这样连接的牌数量最多时即为最长无重复牌叠。
现设计Python程序模拟这个游戏:先显示原始牌叠,洗牌后再显示洗牌牌叠,摸牌后显示最长无重复牌叠张数、起点及终点,并显示最长无重复牌叠的信息。运行结果如第所示。
from random import randint
def dayin(head,tail): #打印牌叠
pt=head; k=0
while :
print(str(pai[pt][0])+'-'+str(pai[pt][1]),end='||')
pt=pai[pt][1]; k=k+1
if k==13: print(); k=0
print('\n','*'*105)
dic={0:'▲',1:'○',2:'★',3:'◇',4:'A',5:'2',6:'3',7:'4',8:'5',9:'6',10:'7',11:'8',12:'9',13:'10',14:'J',15:'Q',16:'K'}
pai=[]; head=- 1; k=0
while k<104:
pai.append([ ,head])
head=len(pai)- 1; k=k+1
print('原始的牌叠')
dayin(head,- 1) #打印原始牌叠
k=0
while k<=103:
x=randint(0,103)
i=0;pt=head
while i<x:
pt=pai[pt][1]
i+=1
if pt!=head:
nhead=pai[head][1]
pai[pt][1]=head
head=nhead
k+=1
print('洗牌后的牌叠')
dayin(head,- 1) #打印洗牌牌堆
f={}
for i in range(4):
for j in range(4,17):
f[dic[i]+dic[j]]=False
L=ans=0; i=j=head
while j!=- 1:
m=pai[j][0]
if not f[m]:
f[m]=True; L=L+1
if L>ans: ans=L; pt=j; qt=i
j=pai[j][1]
else:
while :
f[pai[i][0]]=False
L=L- 1
i=pai[i][1]
print('最长无重复牌叠%d 张'%ans,'起点',qt,'终点',pt)
dayin( )