//2015.3 有n个小朋友围城一圈,玩击鼓传花游戏,将小朋友编号1-n,从1号开始传花,
// 每次传3个,拿到花的小朋友表演节目后退出,任给n,问最后一个小朋友的编号是多少。
// 例如:5个小朋友,1号开始传花,第一个表演的是3号,第二个表演的1号,第三个表演的
// 5号,第四个表演的2号。最后表演的4号。
//思路:两种方法:
//1,循环链表,传到后删除该节点,并且输出,知道最后一个。
//2,建立一个标记访问的数组。知道所有元素均被访问输出为止。
//我们用第二种方法。
#include<iostream>
#include<stdlib.h>
using namespace std;
int main()
{
int n,vis[50]={0};
int i,j,t=0;
cin>>n;
for(i=2,j=0;i<n,j<n;i=(i+1)%n) //从三号小朋友vis[2]开始。
{
if(vis[i]==0) t++; //控制位,保证每过三个没被访问过。
if((t%3)==1)
{
if(vis[i]==0)
{
cout<<i+1<<" ";
vis[i]=1;
}
else
{
while(vis[i]==1) i=(i+1)%n;
cout<<i+1<<" ";
vis[i]=1;
}
j++;
}
}
return 0;
}
//显然此方法有点繁琐,用循环链表处理则会很清晰明了。
