问题
- 魔术师发牌问题的简介:一位魔术师掏出一叠扑克牌,魔术师取出其中13张黑桃,洗好后,把牌面朝下。说:“我不看牌,只数一数就能知道每张牌是什么?”魔术师口中念一,将第一张牌翻过来看正好是A;魔术师将黑桃A放到桌上,继续数手里的余牌,第二次数1,2,将第一张牌放到这叠牌的下面,将第二张牌翻开,正好是黑桃2,也把它放在桌子上。第三次数1,2,3,前面二张牌放到这叠牌的下面,取出第三张牌,正好是黑桃3,这样依次将13张牌翻出,全部都准确无误。求解:魔术师手中牌的原始顺序是什么样子的?
代码
#include<stdio.h>
#include<stdlib.h>
#define cardNumber 13
typedef struct node{
int data;
struct node * next;
}node,*linklist;
void func(linklist* l){
int cardCount = 0;
int i,j;
linklist s,t;
t = (linklist)malloc(sizeof(node));
t->data = 0;
t->next = NULL;
(*l) = t;
s = t;
for(i=1;i<cardNumber;i++){
t = (linklist)malloc(sizeof(node));
t->data = 0;
s->next = t;
s = t;
}
s->next = (*l);
s = (*l);
for(i=1;i<=13;i++){
j=1;
while(j<i){
if(s->data==0){
j++;
}
s = s->next;
}
while(s->data!=0){
s=s->next;
}
s->data = i;
}
printf("发牌顺序为:");
s = (*l);
for(i=1;i<=cardNumber;i++){
printf("%d ",s->data);
s= s->next;
}
printf("\n");
s = (*l);
t = s;
for(i=1;i<=cardNumber;i++){
s = s->next;
free(t);
t = s;
}
}
int main(){
linklist l;
func(&l);
return 0;
}
运行效果
