之前写这个的时候没有想到用递推,就是简单的暴力求解,思路也清晰比较好理解。但是递推版初学者一时半会可能很难理解,这里给出一个用数组求解约瑟夫环的代码。
题目:有n个人围成一个圈,顺序排号,从第一个人开始报数(从1到3报数),凡是报到3的人退出,问最后留下的是原来的第几号的那位?(有些版本要求每次退出的人的位置)
思路:
- 先是要设置一个标志数组flag[],根据输入的大小来确定,将其初始化为0,若flag[m]已退出,则置为1;
- 既然有N个人则要循环N次;
- 在数人的时候要判断是否为有效的数人,通过标志数组flag来判断;
- 如果数人累计3人,则该人退出;
- 要注意数人的时候不能超过数组本身,所以要一直对n取余。
#include "stdafx.h"
#define Max_num 1000
int 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;
}
运行结果如下: