约瑟夫问题

设有n个人排成一圈,其编号1~n,,从编号为1的人开始报数,按顺时针“1,2,3,4”循环报数,数到m的人出列,然后出列者的下一个人开始重新报数,数到m的人又出列,如此反复循环,直到n个人都出列为止。要求输出n个人的出列顺序

例如,有8个人的初始序列1 2 3 4 5 6 7 8 ,则出列顺序4 8 5 2  1 3 7 6

分析:采用容器array存人的编号,设人的编号放到从1放到n,每次数到m的人出列,下标t=(t+m)%i的人出列(t初始值设为0,i表示目前队列中还剩的人数),编号是的人出列后,t后面紧跟的人补到t的位置,后面的依次补上,重新形成一个环形队列,中间不空。然后,紧接上次轮到的位置开始报号.......

void josepbus(int n,int m)
{
   int* p=new int[n+1];
   for(int i=0;i<n;++i)
    p[i]=i+1;
    
    int t=0;
   for(int j=n;j>=1;--j)
   {
     t=(t+m-1)%i;
     printf("%d",p[t]);
    
    //t后的元素依次前移
    for(int j=t+1;j<=i-1;j++)
     p[j]=p[j+1];
  
   }

   printf("\n");
}

 


版权声明:本文为qq_34793133原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。