美文网首页
约瑟夫环问题

约瑟夫环问题

作者: 彳亍cium | 来源:发表于2019-04-14 17:02 被阅读0次

n个人(编号为0,1,...,n-1)围成一个圈子,从0号开始依次报数,每数到第m个人,这个人就得自杀,之后从下个人开始继续报数,直到所有人都死亡为止。问最后一个死的人的编号(其实看到别人都死了之后最后剩下的人可以选择不自杀……)。


约瑟夫环.jpg

问题主要有两种问法

  • 问具体的自杀流程
  • 问最后留下的那个人的编号

下面分别针对两种问法来说明:

1、自杀的流程

可以利用循环链表模拟整个流程
c++实现循环链表实现

#include <iostream>
/*
 * 约瑟夫问题利用循环链表进行模拟
 */
typedef  struct  node{
    int data;
    struct  node*  next;
} node;
//初始化循环链表
node* create(int n) {
    node *head, *p,*s;
    head = (node *) malloc(sizeof(node));  // 空头节点,仅提供一个链表初始化的入口
    p = head;
    if (0 != n) {
        for (int i = 1; i <= n; i++) {
            s = (node *) malloc(sizeof(node));
            s->data = i;
            p->next = s;
            p = s;
        }
        s->next = head->next;         //尾节点指向第一个存有数据的节点
    }
    free(head);
    return s->next;
}

void Josephus_Process(int n, int m, node* p){
    node* temp;
    while ( p->next != p ){
        for(int i = 1; i < m-1 ; i++){
            p = p->next;
        }
        std::cout<<p->next->data<<"->";
        temp = p->next;
        p->next = temp->next;
        free(temp);
        p = p->next;
    }
    std::cout<<p->data<<std::endl;
}
int main() {
     int n = 10;
     int m = 4;
     node* p = create(n);
    Josephus_Process(n,m,p);
     return 0;
}

2、最后留下存活的人

这时可以利用递归方法和数学推导得到最后留下的人

#include <iostream>
#include <list>
using std::cout;
using std::endl;
using std::cin;
using std::list;
 
int main()
{
    int total  = 0;
    cout << "Please input total number of people : ";
    cin >> total;
 
    int number = 0;
    cout << "Please input selected number : ";
    cin >> number;
 
    /* If number = 3
     * f(1) = 0
     * f(2) = 1 = (f(1) + 3) % 2
     * f(3) = 1 = (f(2) + 3) % 3
     * f(4) = 0 = (f(3) + 3) % 4
     * f(5) = 3 = (f(4) + 3) % 5
     * ...
     * f(n) = x = (f(n-1) + 3) % n
     * */
 
    int last = 0; // f(1) = 0
    for(int i = 2; i <= total; ++i)
    {
        last = (last + number) % i;
    }
    cout << "The last one is : " << last + 1 << endl;
 
    return 0;
}

相关文章

  • 约瑟夫环问题

    约瑟夫环问题约瑟夫环描述:约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3…n分别表示)围...

  • 约瑟夫环问题

    0~n-1个数排成环,每次从中删除第m个数字后,问最后剩下的数字是多少 思路:使用链表模拟环状结构,到达尾部时使其...

  • 约瑟夫环问题

    思路 递推,f(n)与f(n-1)的关系,已经f(1)已知,O(n)的复杂度求出结果。f(n) = (f(n-1)...

  • 约瑟夫环问题

    约瑟夫环:30个人(15个教徒和15个非教徒)坐船出海 船坏 需要把15个人扔到海里 其他人才能幸存 围成一圈从某...

  • 约瑟夫环问题

    参考文章 约瑟夫环之二(用递归的思想解决Josephus问题) 解释 解法 初始情况: 0, 1, 2 ........

  • 约瑟夫环问题

    问题描述:n个人(编号0~(n-1)),从0开始报数,报到(m-1)的退出,剩下的人继续从0开始报数。求胜利者的编...

  • 约瑟夫环问题

    题目:一圈人围坐,以数字K位第一个个人,叫道 M 的人自动出列,请写出出列顺序 第一种方法:使用单项循环链表实现 ...

  • 约瑟夫环问题

    在刷leetCode 的时候碰到了以下问题:给定一个从1 到 n 排序的整数列表。首先,从左到右,从第一个数字开始...

  • 约瑟夫环问题

  • 约瑟夫环问题

    问题描述 历史典故: 据说著名犹太历史学家 Josephus有过以下的故事: 在罗马人占领乔塔帕特后,39 个犹太...

网友评论

      本文标题:约瑟夫环问题

      本文链接:https://www.haomeiwen.com/subject/mblcjqtx.html