7-6 猴子选大王
一群猴子要选新猴王。新猴王的选择方法是:让N只候选猴子围成一圈,从某位置起顺序编号为1~N号。从第1号开始报数,每轮从1报到3,凡报到3的猴子即退出圈子,接着又从紧邻的下一只猴子开始同样的报数。如此不断循环,最后剩下的一只猴子就选为猴王。请问是原来第几号猴子当选猴王?
输入格式:
输入在一行中给一个正整数N(≤1000)。
输出格式:
在一行中输出当选猴王的编号。
输入样例:
11
输出样例:
7
思路分析:
这是一种约瑟夫环问题,需要找出最后的胜利者,首先我们可以将每一个人按照自己对应的序列放在数组中,以循环的方式去依次淘汰直至最后一人。我使用的方式的将淘汰的人的数变为-1,标识其已被淘汰,然后不断循环直至只有一人不为-1。具体请看下面的代码
代码如下:
#include<iostream>
using namespace std;
int main()
{
int a[100],i,j,k=1,g=0,z=0,t,n;
cin>>n;
for(i=0,j=1;i<n;i++,j++) //将人数存入数组中,并赋初值
a[i]=j;
i=0;j=0;
while(k)
{
if(a[i]==-1) i++; //判断该人数是否已被淘汰
else j++,i++; //j来控制数到了几,i来控制数组的循环
if(j==3) //j数到3则该数组对应的人被淘汰,值变为-1 ,并吧j归0;
{
a[i-1]=-1;
j=0;
}
if(i==n) i=0; //如果以及到了最后一个人,则将i赋值为1;
for(t=0;t<n;t++) //用于判断数组中是否只剩下一个非-1 的数,并用g记录不是-1的数的下标
if(a[t]==-1) z++;
else g=t;
if(z==n-1) //如果数组中只剩下一个非-1的数则将剩下的数给输出,即为所求
{
k=0; //k负责控制该循环语句
cout<<a[g];
}
else z=0; //此处一定要记得归零z
}
return 0;
}