约瑟夫环算法详解

原创 2018年04月15日 12:22:23

约瑟夫环指的是,n个人按编号顺序围成一个环,设置一个数字m,其中m<n(一般m取0-9之间的数);并从环中的第一个人开始,按顺时针数数,每数了m个位置,排在m号的位置上的人出列,然后从出列的位置的下一个位置上的人开始数,一直到环中剩下最后一个人为止。

算法步骤:

(1)确定存储结构:由于是一个环,所以建立一个循环链表

(2)设置指针个数:设置一个头指针*front永远指向第一个结点(按数字顺序的话是指向环中最小的那个节点也可又从0开始数),再设置一个尾指针*prior用于指向报数的人的位置,每报一次数,尾指针指向下一个节点,数到m号时,则删除该节点,并将尾指针指向下一个节点,一直循环下去。

定义节点类型:

typedef struct Node
{
    int data;
    struct Node *next;
    struct Node *front;
           struct Node *prior;
}Node,*LinkList;

  (3)向链表插入n个人(采用尾插法)

LinkList Create_cirlce()
{
    LinkList L,r,p;
    L = (Node *)malloc (sizeof(Node));  //初始化链表
    L->next = L;
    r = L;                              //r始终指向最后一个结点
    int n;
    while(scanf("%d",&n) != EOF)
    {
        p = (Node *)malloc(sizeof(Node));
        p->data = n;
        p->next = r->next;
        r->next = p;
        r = p;
    }
    r->next = L;
    return L;
}

(4)根据指针判断链表是否已出列到最后一个:判断*prior->next!=L

(5)利用循环遍历出出列的人:此时需利用两个循环,外循环代表遍历到最后一个所需要的循环次数,内循环代表遍历出列的人

    void Josephus(int n,int m){

          for(int i=0;i<n-1;i++){

                for(int j=0;i<m-1;j++){

                        Next();//遍历出出列的人

                        cout<<"出列的人是:"<<current;//显示出当前出列的人的位置

                        ListDelete();//删除节点

        }

                    }

}                    

书友会主讲:张永强

  • foxfly
  • foxfly
  • 2004-04-17 10:42:00
  • 629

基本约瑟夫环问题详解

基本问题描述: 已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为1的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆...
  • liujian20150808
  • liujian20150808
  • 2016-03-18 22:40:41
  • 5810

史上最全的约瑟夫环算法程序和原理

数学算法:#include "stdio.h"#include "stdlib.h"int josephus(int n, int m){    int pos;    if (n == 1) {  ...
  • ZhengKarl
  • ZhengKarl
  • 2010-05-15 21:47:00
  • 33072

最简化约瑟夫环问题的递归算法详细解析

这个问题可能每个学算法的同学都会遇见,我没那么聪明,第一次看见时做不出来,只发现一些规律,后面看到算法也挺久才看懂,这里是将别人的算法结果做一个解析,例子是暂时网上找的递归最简洁的例子: 下面就以这个...
  • m15682532244
  • m15682532244
  • 2017-10-21 15:54:28
  • 604

约瑟夫环数学算法的优化(转)

约瑟夫环数学算法的优化(转) 问题描述:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又...
  • u010781856
  • u010781856
  • 2015-06-23 22:19:29
  • 993

约瑟夫环算法java

package d; import java.util.LinkedList; import java.util.List; public class test { public stat...
  • basycia
  • basycia
  • 2016-04-06 17:54:32
  • 2844

约瑟夫环 java实现

问题: N个人从1到N编号,围城一圈,从1开始报数, 数到X时,将X的编号输出,并将那个人踢出, 下一个从1再开始报数,直到所有人都出去 思路: 就是计数,移除,没有太深的思想,直接上代码: pac...
  • smile0198
  • smile0198
  • 2014-04-30 09:27:43
  • 3775

听说约瑟夫环的 最快的算法

是求 约瑟夫环的 最快的算法    是不是真的,大家去验算ha
  • baidang201
  • baidang201
  • 2012-04-03 23:17:05
  • 369

C语言经典算法100例-069-简单约瑟夫环问题

这里我们实现一个简单的约瑟夫环问题,描述如下: 有N个人站成一圈,从
  • mrbourne
  • mrbourne
  • 2014-05-07 09:24:37
  • 1663

约瑟夫环算法(循环链表解决)

问题:约瑟夫环  有编号从1到N的N个人坐成一圈报数,报到M的人出局,下一位再从1开始,  如此持续,直止剩下一位为止,报告此人的编号X。输入N,M,求出X。 #include stru...
  • koudaidai
  • koudaidai
  • 2012-03-15 18:50:06
  • 950
收藏助手
不良信息举报
您举报文章:约瑟夫环算法详解
举报原因:
原因补充:

(最多只允许输入30个字)