约瑟夫环面向对象版c++
时间: 2023-08-03 10:32:35 浏览: 116
好的,以下是一个基于面向对象的C++实现约瑟夫环的例子:
```c++
#include <iostream>
#include <vector>
using namespace std;
class Josephus {
private:
int n; // 总人数
int k; // 指定报数
vector<int> circle; // 环状结构
int index; // 当前位置
public:
Josephus(int n, int k) : n(n), k(k) {
// 初始化圆环
for (int i = 1; i <= n; i++) {
circle.push_back(i);
}
// 初始位置为0
index = -1;
}
int next() {
// 指针指向下一个人
index = (index + k) % circle.size();
// 获取被淘汰的人
int eliminated = circle[index];
// 删除被淘汰的人
circle.erase(circle.begin() + index);
// 如果是最后一个人则重置指针位置
if (index == circle.size()) {
index = 0;
}
// 返回被淘汰的人
return eliminated;
}
int winner() {
// 只有最后一个人留下来时才停止淘汰
while (circle.size() > 1) {
next();
}
// 返回胜利者
return circle[0];
}
};
int main() {
Josephus josephus(7, 3);
cout << "The winner is: " << josephus.winner() << endl;
return 0;
}
```
这个例子中,我们创建了一个Josephus类来表示约瑟夫环,包含了总人数n,指定报数k,环状结构circle,当前位置index等成员变量。next()方法用于执行一次淘汰,返回被淘汰的人的编号。winner()方法用于执行整个约瑟夫环,返回最后留下的胜利者的编号。
在main()函数中,我们创建了一个7人、指定报数为3的约瑟夫环,并输出了最后留下的胜利者的编号。
阅读全文