Q42将牌洗为逆序1

E:/GitHub/suanfaquti/Q42将牌洗为逆序1.py
'''
问题描述
有2n张牌,每次从中取n张放到最上面(不是分散抽取而是抽取连续的一沓牌),
重复操作直到逆序。比如当4张牌时,顺序是1234->2314->3124->2431->4321.

分析
使用bfs,记录每次抽取后的结果和已经使用的步数,牌数大于等10后速度非常慢。
'''
from itertools import product
from time import clock
from queue import Queue
import itertools as it

def bfs(firstcards,cnt):
    q=Queue()
    q.put((firstcards,cnt))
    while q.qsize:
        cards,cnt=q.get()
        cnt+=1
        for i in range(1,half+1):
            newCards=cards[i:i+half]+cards[:i]+cards[i+half:]
            if reversedCards==newCards:
                return newCards,cnt
            q.put((newCards,cnt))


cardNumber=8
half=int(cardNumber/2)
willFormatedString='{}'*cardNumber
sortedCards=willFormatedString.format(*range(cardNumber))
reversedCards=sortedCards[::-1]

print(bfs(sortedCards,0))           #('76543210', 8)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值