用循环队列求解约瑟夫环问题
时间: 2023-09-12 21:11:13 浏览: 156
使用循环队列可以解决约瑟夫环问题。在这个问题中,循环队列的每个位置都代表一个人,初始时队列中有n个人。从第p个人开始报数,报到m的人将被淘汰。然后从下一个人开始重新报数,直到只剩下一个人为止。循环队列的实现思想与使用数组类似,但需要注意处理队列中人数不断减少的情况。使用循环队列解决约瑟夫环问题的代码如下:
```cpp
#include<iostream>
#include<queue>
using namespace std;
void Josephus(int n, int p, int m) {
queue<int> arr; // 初始化编号
for (int i = 0; i < n; i++) {
arr.push((p - 1 + i) % n + 1);
}
int count = 1; // 记录队头的报号
int data;
while (!arr.empty()) {
data = arr.front(); // 取出队头的数据
arr.pop();
if (count == m) {
cout << data << " "; // 如果报到m,则输出该人的编号
count = 1;
continue;
}
arr.push(data); // 报号不是m的人重新入队列
count++;
}
return;
}
int main() {
int n, p, m;
cout << "Input n, p and m: ";
while (cin >> n >> p >> m) {
if (n == 0 && p == 0 && m == 0) {
cout << "Over!" << endl;
break;
}
cout << "Data in turn: ";
Josephus(n, p, m);
cout << endl;
cout << "Input n, p and m: ";
}
return 0;
}
```
这段代码使用循环队列实现了解决约瑟夫环问题的功能。通过输入n、p和m来确定问题的规模和初始条件。程序会依次输出每次报数淘汰的人的编号,直到最后只剩下一个人。<span class="em">1</span><span class="em">2</span><span class="em">3</span>
#### 引用[.reference_title]
- *1* *2* *3* [【数据结构】基于数组和循环队列解决约瑟夫问题](https://blog.csdn.net/db895166315/article/details/107847538)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"]
[ .reference_list ]
阅读全文