其实很简单,只要把淘汰的人跳过,把最后一个人链接到第一个人,围一个圈,就可以,所以我们是用队列解决。
代码:
#include <iostream>
#include <cstdio>
#include <windows.h>
using namespace std;
bool visit[10000000] = {0};//visit赋初始值
int main()
{
while(true){
int n, s = 0;
scanf("%d", &n);
for(int k = 0; k < n; k++)
{//总共要出队n次
for(int i = 0; i < 3; i++)
{
//1,0000,0000
if(++s > n)
s = 1;
if(visit[s])
i--;
}//类似取模,而因为序列是从1开始的,所以不取模,加判断;若visit过,则i--,使其继续循环
visit[s] = true;//输出,记录已出队
}
printf("%d
", s);
system("pause");
system("cls");
}
return 0;
}