猴子选大王

题目描述

N只猴子选大王,选举方法如下:从头到尾1、2、3报数,凡报3的退出,余下从尾到头1、2、3报数,凡报道3退出;余下的从头到尾报数,还是报3的退出;依此类推,当剩下的两只猴子时,取这时报数报的1的为王。若想当猴子,请问当初应占据什么位置?

输入

一个正整数n,(n<=100),n为-1结束。

输出

1-n应占据的位置。

代码

#include<iostream>
#include<algorithm>
using namespace std;
int x[1100],n;
int main()
{
	int i,j,k,t,f,s=0;
	while(scanf("%d",&n)!=EOF)
	{
		if(n==-1)
			break;
			
		if(n==2 || n==1)
		{
			cout<<1<<endl; 
			continue;
		}
		for(i=1;i<=n;i++)
			x[i]=i;
			
		f=1;
		while(1)
		{
			if(f)
			{
				f=0;
				t=1; s=0;
				for(i=1;i<=n;i++)
				{
					if(x[i]==-1)
					{
						s++; continue;
					}
					
					if(t==3)
					{
						x[i]=-1; t=1; s++;
					}
					else
						t++;
				}
				if(s==(n-2))
				{
					for(i=n;i>=1;i--)
					{
						if(x[i]!=-1)
						{
							cout<<i<<endl; break;
						}
					}
					break;
				}
			}
			else
			{
				f=1;
				t=1; s=0;
				for(i=n;i>=1;i--)
				{
					if(x[i]==-1)
					{
						s++; continue;
					}
					
					if(t==3)
					{
						x[i]=-1; t=1; s++;
					}
					else
						t++;
				}
				if(s==(n-2))
				{
					for(i=1;i<=n;i++)
					{
						if(x[i]!=-1)
						{
							cout<<i<<endl; break;
						}
					}
					 break;
				}
			}	
		}		
	}
	return 0;	
}
posted @ 2021-04-16 14:41  斯文~  阅读(147)  评论(0)    收藏  举报

你好!