魔术师发牌问题

来源:互联网 发布:夜神模拟器mac版玩崩坏 编辑:程序博客网 时间:2024/04/20 10:47

一位魔术师掏出一叠扑克牌,魔术师取出其中13张黑桃,洗好后,把牌面朝下。说:“我不看牌,只数一数就能知道每张牌是什么?”魔术师口中念一,将第一张牌翻过来看正好是A;魔术师将黑桃A放到桌上,继续数手里的余牌,第二次数1,2,将第一张牌放到这叠牌的下面,将第二张牌翻开,正好是黑桃2,也把它放在桌子上。第三次数1,2,3,前面二张牌放到这叠牌的下面,取出第三张牌,正好是黑桃3,这样依次将13张牌翻出,全部都准确无误。求解:魔术师手中牌的原始顺序是什么样子的?

解题思路:利用循环单链表实现,输出原始顺序

#include "stdio.h"#include "stdlib.h"#define NUMBER 13typedef struct node{    int data;    struct node *next;}node, *linkList;linkList InitList(){    linkList head, p;    head = NULL;    p = head;    node *s;    int i;    for (i = 0; i < NUMBER; i++)    {        s = (node*)malloc(sizeof(node));        // 初始化为0,用于判断是否已赋值        s->data = 0;        if (head == NULL)        {            head = s;        }        else            p->next = s;        p = s;    }    s->next = head;    return head;}void Magician(linkList head){    node *p = (node*)malloc(sizeof(node));    p = head;    p->data = 1; //第一张牌放1    int num;    int i;    for (num = 2; num <= NUMBER; num++)    {        for (i = 0; i < num; i++)        {            p = p->next;            if (p->data != 0)            {                // 该位置已有牌,跳过                i--;            }        }        p->data = num;    }}int main(int argc, char const *argv[]){    linkList p;    int i;    p = InitList();    Magician(p);    for (i = 0; i < NUMBER; i++)    {        printf("%d->", p->data);        p = p->next;    }    return 0;}
原创粉丝点击