约瑟夫问题(常规代码,递归代码,链表代码)

2024-03-11 1455阅读

温馨提示:这篇文章已超过377天没有更新,请注意相关的内容是否还可用!

1.约瑟夫问题:

题目描述

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

约瑟夫问题(常规代码,递归代码,链表代码)
(图片来源网络,侵删)

题目输入:                                                            

第一行为人数n;
第二行为报数k。

题目输出:

输出最后胜利者的标号数。

2.常规做法题目分析

约瑟夫问题是一个经典的问题,也称为约瑟夫环问题,主要描述的是有一个编号为 1 到 n 的圆圈,从第一个数字开始,按照固定的步长 m 不断地删除最后一个数字,直到圆圈中只剩下一个数字为止,该数字即为胜者。

例如,当 n=7、m=3 时,删除的数字依次为第 3、第 6、第 2、第 7、第 5、第 1 个数字,胜者为第 4 个数字。

数学公式来计算胜者的编号。

假设 n 个人处于圆圈中,编号从 1 到 n。每次删除第 m 个人,直到只剩下一个人为止。

我们可以使用递推的方式来计算胜者的编号。假设 f(n, m) 表示有 n 个人时,每次删除第 m 个人后的胜者编号。

当 n = 1 时,只剩下一个人,编号为 1,即 f(1, m) = 1。

当 n > 1 时,我们可以把约瑟夫问题看作是每次删除第 m 个人,然后从下一个人开始重新编号的问题。所以,当第一个人被删除后,问题变成了有 n-1 个人时,每次删除第 m 个人的约瑟夫问题。此时胜者的编号为 f(n-1, m)。但是,由于每次删除一个人后,编号都会向前移动 m 位,所以原来的第 m 个人的编号变成了新的第 1 个人,即编号为 m 的人成为了新问题的起点。

#include 
using namespace std;
int josephus(int n, int m) {
    int winner = 0;
    for (int i = 2; i  n;
    cout > m;
    int result = josephus(n, m);
    cout > k;
    int result=f(n,k);
    cout next = head; // 将尾节点的 next 指向头节点,形成循环链表
    return head;
}
// 递归删除链表中每 m 个节点之前的前 m-1 个节点
ListNode* deleteKth(ListNode* cur, int m) {
    // 如果链表只剩一个节点,返回该节点
    if (cur->next == cur) return cur;
    // 找到当前节点的前 m-1 个节点
    for (int i = 0; i next;
    }
    // 删除第 m 个节点,并将链表尾部连接到下一个节点
    ListNode* next = cur->next->next;
    delete cur->next;
    cur->next = next;
    // 递归删除下一个节点之前的前 m-1 个节点
    return deleteKth(next, m);
}
int josephus(int n, int m) {
    ListNode* head = buildLinkedList(n);
    // 使用递归算法删除节点
    ListNode* winner = deleteKth(head, m);
    int ans = winner->val;
    delete winner;
    return ans;  // 返回胜者的编号
}
int main() {
    int n, m;
    cin >> n >> m;
    int ans = josephus(n, m);
    cout 
VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]