小孩報數問題(3750)

有N個小孩圍成一圈,給他們從1開始依次編號,現指定從第W個開始報數,報到第S個時,該小孩出列,然後從下一個小孩開始報數,仍是報到S個出列,如此重複下去,直到所有的小孩都出列(總人數不足S個時將循環報數),求小孩出列的順序。

Input

第一行輸入小孩的人數N(N<=64) 
接下來每行輸入一個小孩的名字(人名不超過15個字符) 
最後一行輸入W,S (W < N),用逗號","間隔

Output

按人名輸出小孩按順序出列的順序,每行輸出一個人名

Sample Input

5
Xiaoming
Xiaohua
Xiaowang
Zhangsan
Lisi
2,3

Sample Output

Zhangsan
Xiaohua
Xiaoming
Xiaowang

Lisi

約瑟夫環

#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <cctype>
#include <iostream>
#include <algorithm>
#include <vector>
#include <stack>
#include <deque>
#include <queue>
#include <set>
#include <list> 
#include <map> 
#include <string>
using namespace std; 
#define infinity 2147483647
 
int main()
{
	int n,i,j,w,m,count,num;
	char s[65][20];
	int flag[65];
	while(scanf("%d",&n)!=EOF)
	{
		for(i=1;i<=n;i++)
		flag[i]=1;
		
		for(i=1;i<=n;i++)
		scanf("%s",s[i]);
		
		scanf("%d,%d",&w,&m);
		count=0;
		num=0;
		for(i=w;i<=n;)
		{
			if(flag[i])
			{
				count++;
			}
			
			if(count==m)
			{
				cout <<s[i] <<endl;
				count=0;
				flag[i]=0;
				num++;
			}
			if(num==n-1)
			{
				for(j=1;j<=n;j++)
				{
					if(flag[j])
					{
						cout <<s[j] <<endl;
						break;
					}
				}
				break;
			}
			if(i==n)//回到頭
			i=1;
			else
			i++;
		}
	
	} 
			
	return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章