约瑟夫环问题

编号为1,2,3,……,n的n个人按顺时针方向围坐一圈。任选一个正整数作为报数上限m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数。报m的人出列,从他在顺时针方向上的下一个人开始重新从1报数,如此下去,直至所有人全部出列为止。设计程序输出出列顺序
 
  1. //约瑟夫环问题
  2. typedef struct _JoinsItem
  3. {
  4.     int date;
  5.     bool deleted;
  6. } JoinsItem;
  7. JoinsItem *g_joinsItem;
  8. void initJoins(int maxLen)
  9. {
  10.     g_joinsItem = new JoinsItem[maxLen];
  11.     int i=0;
  12.     for (i=0; i<maxLen; i++)
  13.     {
  14.         g_joinsItem[i].date = i+1;
  15.         g_joinsItem[i].deleted = false;
  16.     }
  17. }
  18. void uinitJoins()
  19. {
  20.     delete [] g_joinsItem;
  21. }
  22. bool showJoins(int maxLen, int setLen, int begin = 0)
  23. {
  24.     int i=0, j=0;
  25.     int index=begin;
  26.     int indexTmp = 0;
  27.     for (i=0; i<maxLen; i++)
  28.     {
  29.         for (j=0; j<setLen; j++)
  30.         {
  31.             indexTmp = (index+1)%maxLen;
  32.             while (g_joinsItem[indexTmp].deleted)
  33.             {
  34.                 index++;
  35.                 indexTmp = (index+1)%maxLen;
  36.             }
  37.             index = indexTmp;
  38.         }
  39.         printf("%d  ", g_joinsItem[index].date);
  40.         g_joinsItem[index].deleted = true;
  41.     }
  42.     return true;
  43. }
  44. int main()
  45. {
  46.     initJoins(6);
  47.     showJoins(6, 4, 1);
  48.     uinitJoins();
  49. }
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值