用刚学的stl写约瑟夫环
作者:互联网
刚刚学了c++的STL,用vector对元素删除的遍历,写约瑟夫环的实现过程
先把题目和代码贴出来,然后我们慢慢分析
题目描述
Descriptionn 个小孩围坐成一圈,并按顺时针编号为1,2,…,n,从编号为 p 的小孩顺时针依次报数,由1报到m ,当报到 m 时,该小孩从圈中出去,然后下一个再从1报数,当报到 m 时再出去。如此反复,直至所有的小孩都从圈中出去。请按出去的先后顺序输出小孩的编号。
Input每行是用空格分开的三个整数,第一个是n,第二个是p,第三个是m (0 < m,n < 300)。最后一行是:
0 0 0
Output按出圈的顺序输出编号,编号之间以逗号间隔
Sample Input
8 3 4
0 0 0
Sample Output
6,2,7,4,3,5,1,8
错误的代码(待深入研究错误原因)
#include<vector>
#include<iostream>
using namespace std;
int main() {
int I = 1;//信标
vector<int>v;
int n, m;
cin >> n >> m;
for (int i = 0; i <= n; i++) {
v.push_back(i);//把环做出来,0是为了占用一个空间,以便于size运算不加一
}
cout << "被删除的元素是: " << v[I] << endl;//调试
v.erase(v.begin() + I);
}
cout << "The last one is " << v[1] << endl;
return 0;
AC代码如下
#include<vector>
#include<iostream>
#include<cstdio>
using namespace std;
int main() {
int I ;//信标
vector<int>v;
int n, m;
while (cin >> n >> I >> m) {
if (n == m && m == I && m == 0)
break;
for (int i = 0; i <= n; i++) {
v.push_back(i);//用0堵住0号元素
}
int N = n;
while (N--) {//删除n个元素
int i;
int temp = v.size() - 1;//时刻在变
//cout << "temp:" << temp << endl;
I %= temp;//完善一下,保证I的取值是【1,temp】
if (!I)
I = temp;
for (i = 0; i < (m - 1); i++) {//如果起点不是1,这里还是需要完善
I++;
if (I > temp) {
I -= temp;
}
}
/*cout << "当前的I值为" << I << endl;
cout << "当前size为" << v.size() << endl;
cout << "被删除的元素是: " << v[I] << endl;*/
if (v.size() - 1 == n)
cout << v[I];
else
cout << "," << v[I];
v.erase(v.begin() + I);
}
cout << endl;
v.clear();
}
return 0;
}
标签:小孩,stl,刚学,namespace,约瑟夫,int,&&,编号,include 来源: https://blog.csdn.net/sdibt_xhx/article/details/104737754