有n人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来的第几号的那位。。的C++原理
时间: 2023-12-23 22:12:09 浏览: 141
这是经典的约瑟夫问题,可以使用环形链表来模拟这个过程。
具体思路如下:
1. 创建一个长度为n的环形链表,每个节点代表一个人,编号从1到n。
2. 从第一个节点开始,按照顺序报数,每报到3就删除当前节点。
3. 重复上述操作,直到只剩下一个节点,这个节点就是最后留下的人。
代码实现如下:
```c++
#include <iostream>
using namespace std;
struct Node {
int num; // 编号
Node *next; // 下一个节点
Node(int x): num(x), next(NULL) {}
};
int josephus(int n, int k) {
// 创建一个长度为n的环形链表
Node *head = new Node(1); // 头节点
Node *p = head;
for (int i = 2; i <= n; i++) {
p->next = new Node(i);
p = p->next;
}
p->next = head; // 形成环
// 从第一个节点开始,按照顺序报数,每报到k就删除当前节点
Node *pre = p;
p = head;
while (p->next != p) {
// 报数,每报到k就删除当前节点
for (int i = 1; i < k; i++) {
pre = p;
p = p->next;
}
pre->next = p->next;
delete p;
p = pre->next;
}
// 返回最后留下的人的编号
int ans = p->num;
delete p;
return ans;
}
int main() {
int n, k;
cin >> n >> k;
cout << josephus(n, k) << endl;
return 0;
}
```
输入样例:
```
10 3
```
输出样例:
```
4
```
阅读全文