C++实现---报数出圈问题

问题:设有n个人围坐一圈并按顺时针方向从1到n编号,从第s个人开始进行1到m的报数,报数到第m个人,此人出圈,再从他的下一个重新开始1到m的报数,如此进行下去直到所有的人都出圈为止。

#include <iostream>
#include <list>

using namespace std;

// n为总人数,start为开始位置,step为步长
void RemoveCircle(int n, int start, int step)
{
    if (n < 1 || start < 1 || start > n || step < 1)
    {
        return;
    }

    list<int> ilist;
    for (int i = 1; i < n + 1; i++)
    {
        ilist.push_back(i);
    }
    
    list<int>::iterator iter = ilist.begin();
    start -= 1;
    while (start--) // 找到起始位置
    {
        iter++;
    }

    int count = 0;
    while (1 != ilist.size())
    {
        if (iter == ilist.end()) // 遍历到最后一个位置回到开始位置继续
        {
            iter = ilist.begin();
        }

        count++;
        if (count == step) // 找到指定位置的数输出并删除重新计算步长
        {
            cout << *iter << '\t';
            list<int>::iterator del = iter;
            iter++;
            ilist.erase(del);

            count = 0;
        }
        else
        {
            iter++;
        }
    }
    cout << *ilist.begin() << '\t';
}

int main(int argc, char **argv)
{
    RemoveCircle(10, 3, 4);
    cout << endl;

    return 0;
}

结果如下:

6       10      4       9       5       2       1       3       8       7

这里有个需要注意的地方就是:在删除元素的时候会使迭代器失效。所以在这里我先定义了一个del指向要删除的元素,然后让iter指向下一个元素再删除指定元素。

当然代码直接使用了既定的元素1到10,稍加修改一下就可以对任意指定的元素组合做相应处理。再传递一个list<Type>的引用,用来代替里面的list即可。

posted @ 2013-03-15 18:21  小楼一夜听风雨  阅读(2944)  评论(0编辑  收藏  举报