LittleHat

我的技术小站

  C++博客 :: 首页 :: 联系 :: 聚合  :: 管理
  0 Posts :: 9 Stories :: 1 Comments :: 0 Trackbacks

常用链接

留言簿

我参与的团队

搜索

  •  

最新随笔

最新评论

 发现我快把类的封装性给丢了

题目:n 个人围成一圈, 并依次编号1~n,。从编号为1 的人开始,按顺时针方向每隔一人选出一个,
剩下的人重新围成一圈,如此循环直到剩下两人,这剩下的两人就是幸运儿。如果你想成为最后两个
幸运儿,请问开始时应该站在什么位置?(设3<=n<=50)

    大家有兴趣可以做做

    因为要记录人的幸运位置  我觉得用节点记录位置简单些,用数组应该也行,但是我不知道如何处理数组中让元素踢出数组. 似乎这样做很麻烦,每次T出一个数都要响应的改变数组的大小.

    在用类的时候竟然都把定义给忘了.
下面是我刚开始的思路   

struct Tnode
{
   int pos;//位置
   Tnode *next;
}Tnode *head;

    Tnode *p=head;
   int count;//人的个数

...
while(count!=2)//最后留下的2个人
{
 if(*p->next->next==NULL)     //判断从下一个循环是踢第一个人,还是跳一个人,踢下一个
       *p=head;   //设置下循环踢人的位置

 else

      *p=head->next;

    for(  ;*p->next!=NULL||*p->next->next!=NULL;*p=*p->next->next)
     {
         DelNode(p);          //删除当前节点

          count--;        //人数减1
      }
}

count>>head.pos>>head->next.pos;//输出
    虽然用了链,但是思想却还是数组的. 从数组的思想来看,这道题的难点就是要判断T人到最后的时候要判断是否是最后一个,这样非常麻烦,特别是当调的人数很大的时候.

    其实用了瑟夫环的话就没必要这么考虑,只需要考虑跳人的多少 .....

呵呵  我把它类封了~~



    唉~  叹息自己还没学到家,刚开始的时候的错误让我想吐血.
下面是我写的实现代码
struct CJ_Tnode
{
  int data;
  Tnode *next;
};//节点定义
 
class CJ_TPclass
{
   public:
      CJ_TPclass(int ms,int mb,int mm);
      void Creat();
      //int OutNode(Tnode *p);
     void Print();
      ~CJ_TPclass()
   {
     Tnode *temp;
 for(temp=flag;temp->next!=NULL;temp=temp->next)
   delete(temp);
   }
   protected:
       CJ_Tnode *head,*tail,*flag;
       int sump,beginp,m;
};
CJ_TPclass::CJ_TPclass(int ms,int mb,int mm)//初始化
{
                     head=NULL;
                 tail=NULL;
                 sump=ms;
                 beginp=mb;
     m=mm;
     flag=NULL;
                
}
void CJ_TPclass::Creat()//建立循环表
{
       Tnode *temp=NULL;
       int number=1;
       head=new Tnode;
       tail=new Tnode;
       head->data=1;
       head->next=tail;
       tail->data=sump;
       tail->next=head;//建立头和尾
          
      while(number!=(sump-1))//中间插的人的数量 按一定的位置顺序
        {
          temp=new Tnode;
          temp->data=sump-number;
          temp->next=head->next;
    cout<<temp->data<<endl;
          head->next=temp;
          number++;
        }
     
}

void CJ_TPclass::Print()
{
 Tnode *temp=head,*p=NULL;//temp:开始的变量 
 while(temp->data!=beginp)
  temp=temp->next;
 
 while(sump!=2)//留两个 可以设置变量 让用户选择
 {   
 for(int i=1;i<=m;i++)//选人
    temp=temp->next; 
   p=temp->next;//p=temp
   temp->next=p->next;
   cout<<p->data<<endl;
   delete(p);
   sump--;
 } 
  flag=temp; 
 for(int i=1;i<=2;i++)
 {
   cout<<"the last"<<temp->data;//因为留了两个
   temp=temp->next;
 }

}
      
posted on 2007-05-11 19:39 小帽子 阅读(47) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航:   博客园   博客园最新博文   博问   管理