• 约瑟夫问题【2】


    约瑟夫问题【1】这篇博客,不同输出要求继续敲码。

    题目:n个人围成一圈,顺序排号,从第1个人(编号为0的人)从1开始报数,报到m(m<=n)的人出圈,然后下面未出圈的人接着从1开始报数,直到所有人都出圈。请按顺序输出出圈的序号。

    步骤: (1)由于对于每个人只有出圈或不出圈两种状态。因此设置标志数组存放游戏过程中每个人的状态。不妨用1表示出圈,0表示不出圈。
        (2)给标志数组赋初值为0。
        (3)模拟报数游戏的全过程。t从1变化到m控制报数游戏的每节循环,用s累计每节报数的数值,用f统计出圈的总人数;因此游戏结束的条件就是f=m。

    代码如下

     1 //报数出圈
     2 #define _CRT_SECURE_NO_DEPRECATE
     3 #include"stdio.h"
     4 #include <iostream>
     5 using namespace std;
     6 
     7 int main(void){
     8  int a[100] = {0};
     9  int b[100] = {0};
    10  int m = 0,n = 0;
    11  int i = 0,//a的循环
    12   j = 1,//报的数
    13   l = 0;//b的循环
    14  scanf("%d %d",&m,&n);
    15  while(1){  
    16   if(j == n){//报到5后,将编号写入B数组,报数初始化,A数组该成员置1
    17    j = 0;
    18    a[i] = 1;
    19    b[l++] = i+1;
    20   }
    21   if(l == m){//b数组填充了m个数,跳出循环
    22    break;
    23   }
    24   j++;
    25   do{//跳过置1的a数组成员
    26    i++;
    27    if(i == m)
    28     i = 0;
    29   }while(a[i] == 1);
    30  }
    31  for(i = 0;i < m;i ++)
    32   printf("%d ",b[i]);
    33  printf("
    ");
    34  return 0;
    35 }

    实验结果如下

  • 相关阅读:
    [杂题]FZU2190 非提的救赎
    [模拟]ZOJ3480 Duck Typing
    [模拟]ZOJ3485 Identification Number
    [数论]ZOJ3593 One Person Game
    [博弈]ZOJ3591 Nim
    [杂题]URAL1822. Hugo II's War
    二分图相关
    KMP算法详解
    中国国家集训队论文集目录(1999-2009)
    最短路Dijkstra算法的一些扩展问题
  • 原文地址:https://www.cnblogs.com/gaigaichen/p/7603990.html
Copyright © 2020-2023  润新知