约瑟夫问题循环链表实现

    xiaoxiao2021-03-25  110

    问题描述:

    n个人围成一个圈,每个人分别标注为1、2、...、n,要求从1号从1开始报数,报到k的人出圈,接着下一个人又从1开始报数,如此循环,直到只剩最后一个人时,该人即为胜利者。例如当n=10,k=4时,依次出列的人分别为4、8、2、7、3、10,9、1、6、5,则5号位置的人为胜利者。给定n个人,请你编程计算出最后胜利者标号数。

    #include<iostream> using namespace std; struct Node{ int val; Node *next; Node(int v){ val = v; next = NULL; } }; //约瑟夫问题 void JOSEPHUS(int n, int k){ Node *p = NULL; //p表示开始指针 Node *current = NULL; Node *previous = NULL; for (int i = 0; i < n; ++i){ if (i == 0){ p = new Node(1); previous = p; continue; } current = new Node(i + 1); previous->next = current; previous = current; } previous->next = p; while (p->next != p){ for (int j = 1; j < k-1; ++j){ p = p->next; } cout << p->next->val << ' '; p->next = p->next->next; p = p->next; } cout << p->val << endl; cout << "Winner is " << p->val << endl; } int main(){ JOSEPHUS(10, 4); return 0; }

    转载请注明原文地址: https://ju.6miu.com/read-11884.html

    最新回复(0)