用刚学的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;

}
发布了1 篇原创文章 · 获赞 0 · 访问量 21

猜你喜欢

转载自blog.csdn.net/sdibt_xhx/article/details/104737754