这个问题可以使用循环链表来解决。首先,我们可以创建一个包含 m 个节点的循环链表,每个节点表示一个人,并使用编号来标识每个节点。
然后,我们可以从第一个人开始,依次报数并移动到下一个人。当报数达到 n 时,我们将当前节点从链表中删除,然后继续从下一个节点开始报数。重复这个过程,直到只剩下最后一个节点为止。
以下是一个可能的 C++ 实现:#include <iostream>using namespace std;struct Node { int value; Node* next;};void josephus(int m, int n) { // 创建循环链表,编号从1到m Node* head = new Node{1, nullptr}; Node* prev = head; for (int i = 2; i <= m; i++) { Node* newNode = new Node{i, nullptr}; prev->next = newNode; prev = newNode; } prev->next = head; // 将链表闭合成循环 Node* current = head; while (current->next != current) { // 报数n,找到要出圈的节点的前一个节点 for (int i = 1; i < n - 1; i++) { current = current->next; } // 删除要出圈的节点 Node* toRemove = current->next; cout << toRemove->value << endl; current->next = toRemove->next; delete toRemove; // 移动到下一个节点,继续报数 current = current->next; } // 输出最后一个出圈的人的编号 cout << current->value << endl; // 释放内存,删除链表 delete current;}int main() { int m, n; cin >> m >> n; josephus(m, n); return 0;}
这段代码使用了循环链表来模拟围成圈的人,并根据 n 的值进行报数和出圈操作。最后,依次输出出圈的人的编号。请注意,上述代码仅为示例,可以根据需要进行修改和完善。
球一个最佳答案谢谢啦!这对我非常重要! |