美文网首页
魔术师发牌问题 -- python实现

魔术师发牌问题 -- python实现

作者: 雷子_ | 来源:发表于2019-12-18 10:40 被阅读0次

问题描述

魔术师手中有A、2、3……J、Q、K十三张黑桃扑克牌。在表演魔术前,魔术师已经将他们按照一定的顺序叠放好(有花色的一面朝下).魔术表演过程为:一开始,魔术师数1,然后把最上面的那张牌翻过来,是黑桃A;然后将其放到桌面上;第二次,魔术师数1、2;将第一张牌放到这些牌的最下面,将第二张牌翻转过来,正好是黑桃2;第三次,魔术师数1、2、3;将第1、2张牌依次放到这些牌的最下面,将第三张牌翻过来正好是黑桃3;……直到将所有的牌都翻出来为止.问原来牌的顺序是如何的.

正确结果: [1, 8, 2, 5, 10, 3, 12, 11, 9, 4, 7, 6, 13]

解决方案

1. 列表
def solution_list():
    pokers = [0 for _ in range(13)]         # 初始化
    count = len(pokers)                     # 纸牌总数
    index = -1

    for num in range(1, 14):
        i = 0                               # 计数
        while i < num:
            index = (index + 1) % count     # 索引向前一步(可循环)
            if pokers[index] == 0:          # 当前元素为0时才计数, 不为0则跳过
                i += 1
        pokers[index] = num

    print('#' * 50)
    print(f'\n牌组: {pokers}\n')
    print('#' * 50)
2. 单循环链表
class Node:
    """节点"""

    def __init__(self, value):
        self.data = value
        self.next = None

    def __repr__(self):
        return f'Node: {self.data}'


class CircularLinkedList:
    """单循环链表"""
    def __init__(self):
        self.rear = None    # 尾节点

    def is_empty(self):
        return self.rear is None

    def append(self, elem):
        """尾插法"""
        temp = Node(elem)
        if self.rear is None:
            temp.next = temp
            self.rear = temp
        else:
            temp.next = self.rear.next
            self.rear.next = temp
            self.rear = temp
            
    def print_all(self):
        """
        按顺序打印全部节点
        """
        if self.is_empty():
            return
        p = self.rear.next      # 取得头部节点
        print('Head', end='')
        while True:
            print('-->', p.data, end='')
            if p is self.rear:      # 到达尾部停止
                break
            p = p.next
        print('-->Finish')


def solution_circular_linked_list():
    pokers = CircularLinkedList()
    for _ in range(13):
        pokers.append(0)

    temp = pokers.rear
    for num in range(1, 14):
        i = 0
        while i < num:
            temp = temp.next
            if temp.data == 0:
                i += 1
        temp.data = num

    print('#' * 50)
    print('\n牌组: ')
    pokers.print_all()
    print('\n' + '#' * 50)

相关文章

  • 魔术师发牌问题 -- python实现

    问题描述 魔术师手中有A、2、3……J、Q、K十三张黑桃扑克牌。在表演魔术前,魔术师已经将他们按照一定的顺序叠放好...

  • 魔术师发牌问题

      一位魔术师掏出一叠扑克牌,魔术师取出其中13张黑桃,洗好后,把牌面朝下。说:“我不看牌,只数一数就能知道每张牌...

  • 魔术师发牌问题

    问题描述 魔术师利用一副牌中的13张黑牌,预先将他们排好后叠放在一起,牌面朝下,对观众说:“我不看牌,只数数就可以...

  • 魔术师发牌问题

    共13张黑色桃花牌,翻开第一张为A,从牌堆中移除;过一张牌,这张牌放到牌堆最后,然后翻开第二张为2,从牌堆中移除;...

  • 约瑟夫问题、魔术师发牌问题

    据说著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特后,39个犹太人与Josephus及他的...

  • Java 魔术师发牌

    前天学习数据结构的时候,在循环链表时,案例是魔术师发牌,看到用C实现,用到了指针,今天无聊的时候,就用Java实现...

  • 斗地主之基本功能实现

    功能实现 默认先进入的人拥有优先发牌权 点对点发牌接收牌 discard&receive card 发牌后将发牌权...

  • 两人扑克游戏对象的建立

    实现发给服务器发牌给两个人对方收到用户发的牌 poker.js 建立poker对象 服务器进行发牌 js端代码

  • Java斗地主实现

    本案例只是简单的实现了斗地主中的发牌洗牌看牌流程 运行结果:

  • 2018-06-29

    python实现文本分类 - CSDN博客; 根据这个实现分类吧; 编码问题真的很烦;彻底搞懂Python的字符编...

网友评论

      本文标题:魔术师发牌问题 -- python实现

      本文链接:https://www.haomeiwen.com/subject/jkiynctx.html