循环链表之魔术扑克

问题描述

13 张黑桃扑克(A 2 3 4 5 6 7 8 9 10 J Q K),预先排好,正面朝下拿在魔术师的手里,从最上面开始,第一次数一张牌翻过来放在桌面上,正好是“A”;第二次数两张牌,1 的那张放在手中扑克的最下面,数2 的那张翻过来放在桌面上正好是“2”;第三次数三张牌,的那张放在手中扑克的最下面,数2 接着放在下面,数3 的那张翻过来放在桌面上正好是“3;.……,如此下去,放在桌面上的牌最后正好是“A 2 3 4 5 6 7 8 9 10 J Q K”的顺序(从下向上)。

任务编程找出魔术师手中扑克原来的排列顺序(从下向上)

思路:顺着原操作用循环链表模拟这个过程。可以用一个标志量flag,当这张牌被抽出来时候,它就变化状态,下次数牌的时候就不数它。每次抽出一张的牌意思就是按顺序(A 2 3 4 5 6 7 8 9 10 J Q K)给它赋值,第一次抽出放在的是A,第二次抽出放在桌子上的是2,第三次是3……

#include <iostream>
using namespace std;
//为了方便直接public
class Node
{
public:
    int flag;
    char data;
    Node()
    {
        flag=1;
    }
};

int main()
{
    Node a[13];
//按顺序赋值的数组
    char poker[13]={'A','1','2','3','4','5','6','7','8','9','J','Q','K'};
//赋值下标
    int index=0;
//数几张牌的控制量
    int count=0;
//位置:数n张牌的第n张的下标
    int place=0;
    while(index<13)
    {
        int i=0;
        while(i<=count)
        {
            //是没有被抽出的牌才数
        	if(a[place].flag)
        	{
			if(i==count)
        		break;
        		i++;
        	
			}
            //数组循环移动
			if(place==12)
				place=0;
			else
				place++;
        }
		count++;
		a[place].data=poker[index++];
		a[place].flag=0;
		if(place==12)
			place=0;
		else
			place++;

    }
   	for(int i=0;i<13;i++)
   		cout<<i<<" "<<a[i].data<<endl;
   	
    return 0;
}

 

    原文作者:魔术师发牌问题
    原文地址: https://blog.csdn.net/yan_dan/article/details/82807187
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞