zoukankan      html  css  js  c++  java
  • C语言经典算法100例-069-简单约瑟夫环问题

    这里我们实现一个简单的约瑟夫环问题,描述如下:

    有N个人站成一圈,从第一个人开始报数,从1报到3,报到3的那个人走出圈,然后从下一个人开始从1继续报数,重复上面的过程,直到最后圈里只剩下一个人,问这个人是哪个人?

    分析:首先,我们要给这N个人编号,分别编为1到N,

    然后,开始报数,同时记录 当前编号,所报数,圈内人数,

    只要圈内人数大于1,就一直重复,

    报数过程中,如果所报数为3,那么要做这几件事:1,将这个人踢出圈 2,圈内人数减一 3,重置所报数。

    具体实现起来如代码所示:

    //n 个人,报数,去3,剩下几号-简单约瑟夫环问题
    #include <stdio.h>
    #include <stdlib.h>
    #define MAX_SIZE 20
    
    int main()
    {
        int Ring[MAX_SIZE];
        int i, n;
        int cnt;    //代表报的数
        int pos;    //当前位置数
        int num;    //当前环中的人数
        int *p = Ring;    //用指针访问数组
    
        //输入环中的初始人数
        printf("input the n.
    ");
        scanf("%d", &n);
    
        //输入一些元素
        for (i = 0; i < n; i++)
            *(p+i) = i+1;
    
        //报数 去3
        num = n;
        pos = 0;
        cnt = 0;
        
        while (num != 1)    //一直报到剩下一个人
        {
            if(*(p + pos) != 0) ++cnt;  //对当前元素报数
            if (cnt == 3)       //报到3了
            {
                *(p + pos) = 0;         //踢出环
                --num;          //环大小-1
                cnt = 0;        //重置报的数
            }
            ++pos;                //指向下一个元素
            if(pos == n)        //到环尾则返回环头
                pos = 0;
        }
        while (*p == 0) p++;    //找到最后剩下的那个元素
        printf("%d is left",*p);
    
        return 0;
    
    }
    
    这里用数组表示约瑟夫环,数组内元素置0表示不在环内,当位置累积到N时置0来实现“环”结构。
  • 相关阅读:
    2017-4-6校内训练
    [BZOJ]1023: [SHOI2008]cactus仙人掌图
    [BZOJ]1086: [SCOI2005]王室联邦
    [BZOJ]1055: [HAOI2008]玩具取名
    [BZOJ]3527: [Zjoi2014]力
    [BZOJ]2820: YY的GCD
    【BZOJ3233】【tyvj1729】文艺平衡树
    【数据结构】【平衡树】无旋转treap
    【BZOJ2733】【HNOI2012】永无乡
    【BZOJ3224】【tyvj1728】普通平衡树
  • 原文地址:https://www.cnblogs.com/mrbourne/p/9959470.html
Copyright © 2011-2022 走看看