关于约瑟夫环,为什么最后会剩1个,比方说,如果是数到3的那个就出列,那最后肯定也会剩下两个数啊,怎么会最后只剩一个数呢? 比方说,123三个数,数到3就出列,那剩下1和2 永远也不能出列,不是吗?
约瑟夫环,是环装的,你举的例子3个人:比如人用①②③来表示,循环报数,数到3的就出局;
第一次报数:③这个人数到三所以出局,还剩下两个①和②,仍要喊1、2、3的报数,
第二次报数:①这个人喊1,②这个人喊2,然后,①这个人继续喊3,所以①这个人也出局,
最后只剩下②这个人了。
有点啰嗦,但道理就是这样。
约瑟夫问题的一般形式
约瑟夫问题是个有名的问题:N个人围成一圈,从第一个开始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉。例如N=6,M=5,被杀掉的顺序是:5,4,6,2,3,1。分析:(1)由于对于每个人只有死和活两种状态,因此可以用布朗型数组标记每个人的状态,可用true表示死,false表示活。(2...
约瑟夫环的由来
约瑟夫环问题可以用数学模型进行描述。假设有n个人围坐在一个圆圈里,从第一个人开始报数,每数到第m个人就将其移出圆圈,然后由下一个人继续报数,直到圆圈里只剩下一个人为止。这个问题可以看作是一个循环过程,每次循环都会有一个元素被移出圆圈,直到圆圈中只剩下一个人。解决约瑟夫环问题的方法可...
约瑟夫游戏问题
约瑟夫问题是个有名的问题:N个人围成一圈,从第一个开始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉。例如N=6,M=5,被杀掉的人的序号为5,4,6,2,3。最后剩下1号。 假定在圈子里前K个为好人,后K个为坏人,你的任务是确定这样的最少M,使得所有的坏人在第一个好人之前被杀掉。 C++代码示例...
...围成一圈,顺序排号。凡报到3的人退出圈子,问最后留下的是原来第几...
因为有一个人退出了圈子,所以还剩下n-1个人,我们对剩下的人重新从0到n-2编号,同样有公式(k1+3)%n(其中k1为n-2个人时退出圈子的人的标号)得出n-1个人时退出圈子人的标号,以此类推直到n等于1时kn-1=0也就是1个人时留下的就是标号为0的人 以此有递推公式f(1)=0,f(i)=(f(i-1)+3)...
有n个人围成一圈从1-3报数
首先从一个人开始,越过k-2个人(因为第一个人已经被越过),并杀掉第k个人。接着,再越过k-1个人,并杀掉第k个人。这个过程沿着圆圈一直进行,直到最终只剩下一个人留下,这个人就可以继续活着。问题是一开始要站在什么地方才能避免自杀?Josephus要他的朋友先假装遵从,他将朋友与自己安排在第16个...
约瑟夫环(单向循环链表)_C语言「抄作业」
直到最后剩下2人。最终,Josephus与另一人分别位于第16和第31的位置上。示例输出 在C语言抄作业系列中,提供了关于约瑟夫环问题的代码实现。该实现旨在解决Josephus与另一人最初位次的计算问题。作为一个计算机科学专业毕业多年后转行至产品经理的人,从当年的作业中搜集了这部分代码,供参考。
用循环队列实现约瑟夫环处理.若干人循环报数,凡报到3的倍数退出,最后剩...
\/\/ 首先确认n个人,并打上标记 int n = 10;\/\/ 退出的报数数字 int say = 3;Queue<Integer> qu = new LinkedList<Integer>();for (int i = 0; i < n; i++) { qu.add(i + 1);} \/\/ 开始报数技术 int j = 1;int lastMan = 0;while (qu.size() > 0) { lastMan = qu...
约瑟夫环公式是怎样推导出来的?
1、约瑟夫环公式推导:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列。依此规律重复下去,直到圆桌周围的人全部出列。这个就是约瑟夫环问题的实际场景,有一种是要通过输入n,m,k三...
python 实现7个人,从1数到3,数到3的出局,来回循环,最后剩下一个人
这个叫猴子选大王,也叫约瑟夫环
...每隔一个删去一个(删2,4,6,8...开始),最后剩下的数是多少?_百度知 ...
这是约瑟夫环问题,就是从1开始数数,然后每数到2就从这个圈里吧这个人踢出去,然后从新开始数. 比如:1,2这时候第二个人数到了2所以踢掉2,然后第三个人数1,第四个人数2,然后把第四个人踢掉,以此类推,直到剩下一个人为止,查看那个人的编号即可. 根据这种思想,我们应该建立一个链表,这个链表是...