Description
设有N个人围成一个圈,每人手里都握着一个令牌写明一个数字(随机生成的)。从第一个人开始玩“击鼓传花”游戏,
第一个击的次数为其令牌上写明的数字数(假设为m1)。第m1个人出列。下次再从第m1+1个人开始新的“击鼓传花”
击的次数也为其令牌上写明的次数,等于该次数的人出列。重复以上过程直到所有人都出列为止。
Input
输入第一行为测试数据组数。每组测试数据2行,第1行一个整数n(1<=n<=10000),代表人数,
第2行有n个空格隔开的整数代表mi(1<=mi<=5000)。
Output
对每组测试数据输出2行,第1行为数据组数,第2行为所有人顺序出队的序列,格式见样例。
Sample Input
1
5
1 2 3 4 5
Sample Output
Case #1:
2 1 3 4
HINT
考察知识点:循环链表,时间复杂度O(sum{m}),空间复杂度O(n)
法1:
#include <iostream>
#include <deque>
using namespace std;
typedef struct node{
int No;
int value; //value为牌子上的数字数
}People;
void put_in(deque<People> &Circle){
int quantity;
cin >> quantity;
for(int i=0;i<quantity;i++){
People peo;
peo.No = i + 1;
cin >> peo.value;
Circle.push_back(peo);
}
}
int main(){
deque<People> Circle;
int T,T1=1;
cin>>T;
while(T1 <= T){
put_in(Circle);
cout<<"Case #"<<T1 ++<<":"<<endl;
int i=0;
while(Circle.size() > 1){
int num = Circle[i].value;
//对于环形队列的另一种遍历方法
if(i + num >= Circle.size()) i = (i + num) % Circle.size();
else i = i + num;
cout<<Circle[i].No<<" ";
Circle.erase(Circle.begin() + i);
}
cout<<endl;
}
return 0;
}
法2:
#include <iostream>
#include <deque>
using namespace std;
typedef struct node{
int No;
int value; //value为牌子上的数字数
}People;
void put_in(deque<People> &Circle){
int quantity;
cin >> quantity;
for(int i=0;i<quantity;i++){
People peo;
peo.No = i + 1;
cin >> peo.value;
Circle.push_back(peo);
}
}
int main(){
deque<People> Circle;
int T,T1=1;
cin>>T;
while(T1 <= T){
put_in(Circle);
cout<<"Case #"<<T1 ++<<":"<<endl;
int i=0;
while(Circle.size() > 1){
int num = Circle[i].value;
//对于环形队列的一种遍历方法
int j=1;
while(j <= num){
if(i == Circle.size()-1) i = 0;
else i ++;
j ++;
}
cout<<Circle[i].No<<" ";
Circle.erase(Circle.begin() + i);
}
cout<<endl;
}
return 0;
}