一位魔术师掏出一叠扑克牌,魔术师取出其中13张黑桃,洗好后,把牌面朝下。说:“我不看牌,只数一数就能知道每张牌是什么?”魔术师口中念一,将第一张牌翻过来看正好是A;
魔术师将黑桃A放到桌上,继续数手里的余牌,第二次数1,2,将第一张牌放到这叠牌的下面,将第二张牌翻开,正好是黑桃2,也把它放在桌子上。第三次数1,2,3,前面二张牌放到这叠牌的下面,取出第三张牌,正好是黑桃3,这样依次将13张牌翻出,全部都准确无误。
求解:魔术师手中牌的原始顺序是什么样子的
#include<iostream>
using namespace std;
#include<ctime>
//循环链表
//魔术师发牌问题
//创建结构体
typedef struct Pnode
{
int data;
Pnode *next;
}*linklist;
void creatlist(linklist &L, int n)
{
linklist head, temp;
head = (linklist)malloc(sizeof(Pnode));//创建头指针
head->next = L;
int i = 1;
if (n > 0)
{
L->data =14;//初始的数值都给14
L->next = NULL;//给第一个结点赋值
temp = L;
for ( i = 1; i < n; i++)
{
linklist p = (linklist)malloc(sizeof(Pnode));
p->data =14;
temp->next = p;
p->next = NULL;
temp = p;
}
temp->next = L;//尾结点指向头结点
free(head);//释放head
}
else
{
cout << "error to input" << endl;
}
}
void print(linklist &L,int n)
{
linklist p=L,k=L;
for (int i = 0; i < n; i++)
{
cout <<p->data << " ";
p = p->next;
}
cout << endl;
}
int main()
{
srand((unsigned int)time(NULL));
linklist L=(linklist)malloc(sizeof(Pnode));
creatlist(L, 13);
linklist p = L;//关于为什么在操作链表的时候都要把链表赋值给另一个结点是因为在操作链表后悔改变链表次序,赋值给另一个结点可以用哪个结点遍历操作链表元素
print(L, 13);
int num=1;
//p->data = 1;
//p = p->next;
//p->data = 2;
//print(L, 13);
while (num!=14)
{
for (int j = 0; j < num; j++)
{
if (p->data != 14)
{
while (p->data != 14)//跳过已经付过值的元素
{
p = p->next;
}
}
else
{
if (j != num - 1)//在for循环最后一次跳出
{
p = p->next;
}
}
}
p->data = num;
p = p->next;
num++;
}
print(L, 13);
system("pause");
return 0;
}