#include <iostream>
using namespace std;

// 定义循环链表节点
struct ListNode {
    int val;  // 节点值
    ListNode* next;  // 下一个节点指针
    ListNode(int x) : val(x), next(NULL) {}
};

// 创建循环链表
ListNode* createLinkedList(int n) {
    ListNode* head = new ListNode(1);
    ListNode* cur = head;
    for (int i = 2; i <= n; i++) {
        ListNode* newNode = new ListNode(i);
        cur->next = newNode;
        cur = cur->next;
    }
    cur->next = head;  // 将最后一个节点指向头节点,形成循环链表
    return head;
}

// 约瑟夫退圈问题
void Josephus(int n, int startId, int m) {
    ListNode* head = createLinkedList(n);  // 创建循环链表
    ListNode* cur = head;
    while (cur->next != cur) {  // 当链表中还有多于一个节点时
        for (int i = 1; i < m; i++) {  // 从startId开始数m个数
            cur = cur->next;
        }
        cout << cur->next->val << " ";  // 输出出列的人员编号
        cur->next = cur->next->next;  // 删除出列的节点
        cur = cur->next;  // 更新当前节点
    }
    cout << cur->val << endl;  // 输出最后一个出列的人员编号
}

int main() {
    int n, startId, m;
    cin >> n >> startId >> m;  // 输入n、startId和m
    Josephus(n, startId, m);
    return 0;
}
``
使用c++进行编译代码精简。附带详细注释语言精简约瑟夫退圈问题:利用循环链表类实现约瑟夫退圈问题:n 个人不同 id围成一个圈从 startId任意数个开始报数 m任意数个数数 m 的人出列排成新队列m 清零然后又从下一个人开始数m 个数开始数到 m 就出列接在新队列尾部如此重复直到所有人都出列为止请输出出列的次序依次输出出列人员的编号。说明:参数nstratId和m要通过输入确定注意要考虑sta

原文地址: http://www.cveoy.top/t/topic/iJXB 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录