POJ3750_小孩报数问题【约瑟夫环】【string】【list】

小孩报数问题
Time Limit: 1000MS Memory Limit: 65536K
Total Submissions: 10309 Accepted: 4783


Description


有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


Source


题目大意:题意很明确,就是约瑟夫环。不过从第W个位置开始计数1,数S个

位置,然后出环,输出。

思路:用STL里边的string存放小孩的名字。用list双向链表模拟约瑟夫环。

注意:

string里边clear();用来清除所有字符。

list里push_back(i);用来将编号i放入list

begin();指向第一个元素的位置

end();指向最后一个元素后边的位置

list<int>::iterator it;迭代器用来指向报数编号。

find(first,last,value);用来在区间[first,last)之间找到值等于value的位置

erase(it);用来删除迭代器it指向的元素

*it 表示迭代器it指向的元素值


#include<iostream>
#include<algorithm>
#include<string>
#include<list>
using namespace std;

string child[100];
list<int> v;
int main()
{
    int N,W,S;
    while(cin >> N)
    {
        v.clear();
        for(int i = 1; i <= N; ++i)
            child[i].clear();
        char c;
        for(int i = 1; i <= N; ++i)
            cin >> child[i];
        cin >> W >> c >> S;
        for(int i = 1; i <= N; ++i)
            v.push_back(i);
        list<int>::iterator it;
        it = find(v.begin(),v.end(),W);
        while(v.size() > 0)
        {
            for(int i = 1; i < S; i++)
            {
                ++it;
                if(it == v.end())
                    it = v.begin();
            }
            cout << child[*it] << endl;
            it = v.erase(it);
            if(it == v.end())
                it == v.begin();
        }
    }

    return 0;
}



你可能感兴趣的:(POJ3750_小孩报数问题【约瑟夫环】【string】【list】)