【问题描述】
13 张黑桃扑克(A 2 3 4 5 6 7 8 9 10 J Q K),预先排好,正面朝下拿在魔术师的手里,从最上面开始,第一次数一张牌翻过来放在桌面上,正好是“A”;第二次数两张牌,数1 的那张放在手中扑克的最下面,数2 的那张翻过来放在桌面上正好是“2”;第三次数三张牌,数1 的那张放在手中扑克的最下面,数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;
}