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即可。