zoukankan      html  css  js  c++  java
  • 用循环单链表实现约瑟夫环

    题目:n个人编号分别是1,2,3,...,n,围坐在一张圆桌周围,从编号为k的人开始报数,数到m的人出列。然后他的下一个人开始报数,数到m的那个人又出列;依次循环,直到所有人出列。

    struct LNode{
      int data;
      LNode *next;
    };
    
    //n为总人数,k为第一个开始报数的人,m为出列者喊到的数
    void solve(int k,int m, int n)
    {
       if(k>n || n<=0 || m<=0)
        {
           throw "Invalid argument(s)";
         }
    
    //建立循环链表
       LNode *p = new LNode;
       p->data = 1;
       p->next = p;
    
       LNode *curr = p;
    
       for(int i=2;i<=n;i++)
       {
          LNode *q = new LNode;
          q->data = i;
          p->next = q;
          q->next = curr;
          p=p->next;
       }
    
    //把当前指针移动到第一个报数的人
       while(--k)
       {
          curr = curr->next;
       }
        LNode *pre;
        int m1=m;
       while(n--)
       {
         while(--m1)
           {
             pre = curr;
             curr = curr->next;
            }
          m1 = m;
          cout<<curr->data<<" ";
          pre->next = curr->next;
         delete curr;
          curr = pre->next;
       }
    
    }
    
    int main()
    {
        solve(2,2,4);
        return 0;
    }


    注意:while(k--)比while(--k)多循环一次,在循环体中k值大小相同。

     
  • 相关阅读:
    关于Manjaro+kde桌面Tim闪退的解决
    Manjaro-kde-18.1.3安装体验
    Ubuntu19.10安装
    OPPO R11刷机初体验
    Microsoft store应用商店打不开0x80131500
    提问回顾与个人总结
    OO第三单元总结
    OO第二单元总结
    软工案例分析作业
    OO第一单元总结
  • 原文地址:https://www.cnblogs.com/Xylophone/p/3708547.html
Copyright © 2011-2022 走看看