约瑟夫环问题的算法设计是什么样子的??

如题所述

来自百度百科
约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。
这个就是约瑟夫环问题的实际场景,有一种是要通过输入n,m,k三个正整数,来求出列的序列。这个问题采用的是典型的循环链表的数据结构,就是将一个链表的尾元素指针指向队首元素。 p->link=head
  解决问题的核心步骤:(程序的基本算法)
  1.建立一个具有n个链结点,无头结点的循环链表;
  2.确定第1个报数人的位置;
  3.不断地从链表中删除链结点,直到链表为空。
  void JOSEPHUS(int n,int k,int m) //n为总人数,k为第一个开始报数的人,m为出列者喊到的数
  {
  /* p为当前结点 r为辅助结点,指向p的前驱结点 list为头节点*/
  LinkList p,r,list; /*建立循环链表*/
  for(int i=0;i<n;i++)
  {
  p=(LinkList)malloc(sizeof(LNode));
  p->data=i;
  if(list==NULL)
  list=p;
  else
  r->link=p;
  r=p;
  }
  p->link=list; /*使链表循环起来*/
  p=list; /*使p指向头节点*/
  /*把当前指针移动到第一个报数的人*/
  for(i=0;i<k;i++)
  {
  r=p;
  p=p->link;
  }
  /*循环地删除队列结点*/
  while(p->link!=p)
  {
  for(i=0;i<m-1;i++)
  {
  r=p;
  p=p->link;
  }
  r->link=p->link;
  printf("被删除的元素:%4d ",p->data);
  free(p);
  p=r->link;
  }
  printf("\n最后被删除的元素是:%4d",P->data);
  }
温馨提示:内容为网友见解,仅供参考
第1个回答  2012-03-29
约瑟夫环问题是有一个递推公式的,自己去维基百科查吧。

约瑟夫环问题的算法设计是什么样子的??
约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。这个就是约瑟夫环问题的实际场景,有一种是要通过输入n...

约瑟夫环的算法原理
约瑟夫环运作如下:1、一群人围在一起坐成 环状(如:N)2、从某个编号开始报数(如:K)3、数到某个数(如:M)的时候,此人出列,下一个人重新报数4、一直循环,直到所有人出列 ,约瑟夫环结束

【生活处处皆算法】巧用约瑟夫环
约瑟夫环 (约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出圈;他的下一个人又从1开始报数,数到m的那个人又出圈;依次规律重复下去,直到剩余最后一个胜利者。例如:有10个人围成一圈进行此游戏,每个...

约瑟夫环的问题求解
约瑟夫斯问题的核心是确定在n个人中,每隔m个人进行一次消减操作后,最后剩下的人的初始位置。例如,n=10时,先消去每隔2个人,剩余5个人,问题转化为在剩余的5个人中找出最后幸存者,以此类推。当m=2时,问题相对简单。以n=10为例,经过一轮消减后,问题规模变为一半,即在剩下的5个人中找出最后...

约瑟夫问题的一般形式
约瑟夫问题是个有名的问题:N个人围成一圈,从第一个开始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉。例如N=6,M=5,被杀掉的顺序是:5,4,6,2,3,1。分析:(1)由于对于每个人只有死和活两种状态,因此可以用布朗型数组标记每个人的状态,可用true表示死,false表示活。(2...

1到999围成一圈,从1开始每隔一个删去一个(删2,4,6,8...开始),最后剩下...
这是约瑟夫环问题,就是从1开始数数,然后每数到2就从这个圈里吧这个人踢出去,然后从新开始数. 比如:1,2这时候第二个人数到了2所以踢掉2,然后第三个人数1,第四个人数2,然后把第四个人踢掉,以此类推,直到剩下一个人为止,查看那个人的编号即可. 根据这种思想,我们应该建立一个链表,这个链表是...

数据结构中的约瑟夫环问题用C语言怎么编写出来啊?
1. 程序分析:这是一个比较经典的算法--约瑟夫环问题.2.个人分析: 算法比较经典,对于这样的问题本应该使用链表的形式会比较容易.约瑟夫环算法 则体现了使用数组来完成链表该完成的功能,虽然形式上完全不相同,但却求出了 相同的结果.有异曲同工之妙.总之我个人认为是数组中非常经典的算法了.希望本 ...

请问一个约瑟夫相关的问题
最后剩下的数是334。这个问题基本没法用O(n)的复杂度来做,我来阐述一下我的观点。头44个数基本都有规律可循,因为要从1开始加,加到999,然后减少一人,这样的话勉强可以总结出一下规律:1 第一次计算时是 1000-999= 1,第一个被Kill的是1000-1=999 2 第二次计算可用 999 -999= 0,第...

敢死队问题 C\/C++
问题描述:n个人(编号0~(n-1)),从0开始报数,报到(m-1)的退出,剩下的人继续从0开始报数。求胜利者的编号。我们知道第一个人(编号一定是m%n-1) 出列之后,剩下的n-1个人组成了一个新的约瑟夫环(以编号为k=m%n的人开始):k k+1 k+2 ... n-2, n-1, 0, 1, 2, ......

约瑟夫环程序who用pascal写了?
约瑟夫问题:program p1(input,output);const maxn=1000;var ay:array[1..1000]of boolean;i,n,s,m,p,j:integer;begin readln(n,s,m);for i:=1 to n do ay[i]:=true;j:=0;i:=s;p:=1;while(j<n)do begin if p=m then begin ay[i]:=false;j:=j+1;p:=0;write(i,' ...

相似回答