鱼C论坛

 找回密码
 立即注册
查看: 2746|回复: 0

[学习笔记] 魔术师发牌问题C++

[复制链接]
发表于 2017-7-26 09:49:30 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
问题:
魔术师手中有A、2、3……J、Q、K十三张黑桃扑克牌。在表演魔术前,魔术师已经将他们按照一定的顺序叠放好(有花色的一面朝下)。魔术表演过程为:一开始,魔术师数1,然后把最上面的那张牌翻过来,是黑桃A;然后将其放到桌面上;第二次,魔术师数1、2;将第一张牌放到这些牌的最下面,将第二张牌翻转过来,正好是黑桃2;第三次,魔术师数1、2、3;将第1、2张牌依次放到这些牌的最下面,将第三张牌翻过来正好是黑桃3;……直到将所有的牌都翻出来为止。问原来牌的顺序是如何的。

思路:需要先创建一个循环链表,包含13个元素,每个元素初始值设置为0;然后用当魔术师手中持牌的点数依次填充循环链表,改变其初始值;最后遍历循环链表,输出魔术师手中持牌的顺序。

  1. #include <iostream>
  2. using namespace std;
  3. #define N 13
  4. class Node{
  5. public:
  6.         Node *next;
  7.         int data;         
  8. };

  9. class CircleList{
  10. private:
  11.         Node *first;
  12.         int length;

  13. public:
  14. //定义如何创建一个循环链表,注意返回头节点
  15.         Node *creatList(int n){
  16.                 first=new Node;
  17.                 Node *s,*r;
  18.                 r=first;
  19.                 for(int i=0;i<n;i++){
  20.                         s=new Node;
  21.                         s->data=0;
  22.                         r->next=s;
  23.                         r=s;
  24.                 }
  25.                 r->next=first;
  26.                 return first;
  27.                
  28.         }
  29.        
  30.         //清除链表
  31.         void clearList(){
  32.                 Node *p=first;
  33.                 while(p->next!=first){
  34.                         Node *temp=p->next;
  35.                         delete p;
  36.                         p=temp;
  37.                 }
  38.         }
  39.        
  40.         //遍历。注意由于头节点没有赋值,是系统随机赋值的,
  41.         //并不是我们想要的结果,所以遍历时会将first节点跳过。
  42.         //若first节点单独赋值,并希望打印出来,则P节点和循环结束条件有所不同
  43.         void traverse(){
  44.                 Node *p=first->next;
  45.                 while (p!=first){  
  46.                         cout<<p->data<<"\t";
  47.                         p=p->next;
  48.                 }
  49.         }

  50. };

  51. //魔术师的牌排列顺序实现。传入一个循环链表的头节点,给循环链表的节点重新赋值,得到牌的顺序
  52. void magic(Node *pokerHead){
  53.     //对于头节点要不要使用,是否要单独赋值的细节处理不同
  54.     //则遍历的细节也不同
  55.         //Node *poker=pokerHead;  //使用头节点的方式
  56.         Node *poker=pokerHead->next;    //不使用头节点的方式
  57.         poker->data=1;
  58.         int countNum=2;
  59.         while(1){
  60.                 for(int i=0;i<countNum;i++){
  61.                         poker=poker->next;
  62.                         if(poker->data!=0){
  63.                                 i--;
  64.                         }

  65.                 }
  66.                 if(poker->data==0){
  67.                         poker->data=countNum;
  68.                         countNum++;
  69.                         if(countNum>N) break;
  70.                 }
  71.         }
  72. }
  73. void display(Node *pokerHead){
  74.     /*
  75.     //使用头节点的遍历方式
  76.         Node *p=pokerHead;
  77.         while(p->next!=pokerHead){  
  78.         cout<<p->data<<"\t";
  79.                 p=p->next;
  80.         }
  81.         cout<<p->data;
  82.         */
  83.        
  84.         //不使用头节点的遍历方式
  85.         Node *p=pokerHead->next;
  86.         while(p!=pokerHead){
  87.                 cout<<p->data<<"\t";
  88.                 p=p->next;
  89.         }
  90. }

  91. int main(){
  92.        
  93.         CircleList circle1;
  94.         Node *p=circle1.creatList(N);
  95.         circle1.traverse();
  96.         cout<<"-----"<<endl;
  97.         magic(p);
  98.         display(p);
  99.         return 0;
  100. }
复制代码

评分

参与人数 1鱼币 +5 收起 理由
小甲鱼 + 5

查看全部评分

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-27 03:09

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表