#include<iostream>
using namespace std;
struct node
{
int data; //牌的大小
int num; //牌所在位置
node *next;
};
node *transform(node *head)
{
int i=1;
node *p=head->next;
node *start,*r;
r=start=new node; //由原来链表创建一个新的链表 ,r->next指的地址是不确定的
while(p!=NULL)
{
if(p->num%2==0) //添加序号为偶数的节点
{
node *q=new node; //因此一定要在这里创建节点 ,然后r->next指向去,给节点重新定义序号
q->data=p->data; //数据与要添加的相同
q->num=i;
r->next=q;
r=r->next;
i++;
}
p=p->next;
}
p=head->next; //重新指向初始指针
while(p!=NULL)
{
if(p->num%2==1)
{
node *q=new node; //添加序号为奇数的节点 ,给节点重新定义序号
q->data=p->data; //数据与要添加的相同
q->num=i;
r->next=q;
r=r->next;
i++;
}
p=p->next;
}
r->next=NULL;
return start;
}
int main()
{
int n;
cout<<"请输入洗牌次数:"<<endl;
cin>>n;
node *head,*r,*start,*a;
head=r=new node;
for(int i=0;i<54;i++) //创建初始链表
{
node *p=new node;
p->data=i;
p->num=i+1;
r->next=p;
r=r->next;
}
r->next=NULL;
for(int i=1;i<=n;i++) //洗牌次数
{
head=transform(head);
a=start=head;
head=head->next;a=a->next;
while(a->next!=NULL)
a=a->next;
cout<<"洗了"<<i <<"次后为:"<<endl; //输出每次洗牌后的数字顺序
while(head!=NULL)
{
cout<<head->data<<" ";
head=head->next;
}cout<<endl;//<<"最后一张牌为:"<<a->data<<endl;
head=start;
}
return 0;
}
有一副扑克共54张,初始的时候从上到下编号为0~53,每次洗牌的时候,会把偶数位置的牌都全部放到最前面,比如最开始时编号顺序为:0,1,2……52,53;第一次洗牌之后,顺序变为:1,3,5……50,52;第二次洗牌后,顺序变为:3,7,11……46,50。
给出洗牌次数n,要求输出最后的牌的编号顺序。