zoukankan      html  css  js  c++  java
  • 约瑟夫问题【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 }

    实验结果如下

  • 相关阅读:
    题解 CF1156A 【Inscribed Figures】
    P1352 没有上司的舞会 题解
    厦门大学附属实验中学第五次OI模拟赛(XDFZOI5)比赛须知
    属于自己的期中考总结
    做题笔记 【模板】字符串哈希
    2018 总结
    做题笔记 图的遍历 P3916
    做题笔记 Splitting into digits CF1104A
    LIS (nlogn)
    标准正交基
  • 原文地址:https://www.cnblogs.com/gaigaichen/p/7603990.html
Copyright © 2011-2022 走看看