约瑟夫环(非递推版)

来源:互联网 发布:word彩页用什么软件 编辑:程序博客网 时间:2024/06/18 06:52

之前写这个的时候没有想到用递推,就是简单的暴力求解,思路也清晰比较好理解。但是递推版初学者一时半会可能很难理解,这里给出一个用数组求解约瑟夫环的代码。

题目:有n个人围成一个圈,顺序排号,从第一个人开始报数(从1到3报数),凡是报到3的人退出,问最后留下的是原来的第几号的那位?(有些版本要求每次退出的人的位置)

思路:

  • 先是要设置一个标志数组flag[],根据输入的大小来确定,将其初始化为0,若flag[m]已退出,则置为1;
  • 既然有N个人则要循环N次;
  • 在数人的时候要判断是否为有效的数人,通过标志数组flag来判断;
  • 如果数人累计3人,则该人退出;
  • 要注意数人的时候不能超过数组本身,所以要一直对n取余。
#include "stdafx.h"#define Max_num 1000int main(){    int num = 0;    int n;    cin >> n;    int flag[Max_num] = { 0 };    int cnt = 0;    int yu = n;    while (yu--)  //循环N次    {        while (cnt < 3)             {            if (flag[num % n] == 0 && cnt < 3)      //有效的数人            {                cnt++;                num++;            }            else if (flag[num % n] == 1 && cnt < 3)  //无效的数人                num++;            if (cnt == 3)            {                cout << (num - 1) % n + 1 << endl;                cnt = 0;                flag[(num - 1) % n] = 1;  //这个跳出                break;            }        }    }    return 0;}

运行结果如下: