约瑟夫环问题
约瑟夫斯问题
有时也称为约瑟夫斯置换,是一个出现在计算机科学和数学中的问题。在计算机编程的算法中,类似问题又称为约瑟夫环。
人们站在一个等待被处决的圈子里。 计数从圆圈中的指定点开始,并沿指定方向围绕圆圈进行。 在跳过指定数量的人之后,执行下一个人。 对剩下的人重复该过程,从下一个人开始,朝同一方向跳过相同数量的人,直到只剩下一个人,并被释放。
问题即,给定人数、起点、方向和要跳过的数字,选择初始圆圈中的位置以避免被处决。
问题
有n个人编号,站成一圈:
1 2 3 4 … … n-1 n
现在从1开始进行报数,报到k的出列自杀,然后剩下的人继续从1报数(当到达编号为n的人时,下一个报数的从编号为1的人开始进行):
1 2 3 4… k(出列自杀) 1 2 …
直到圈内只剩余m人,求胜利者的编号。
例如:当n=6, k=5, m=1时,5,4,6,2,3将会被依次处决,而1将会幸免。
示例代码如下:
1 | import java.util.ArrayList; |
输出结果:
1 | 共10人,依次报数,当报到4的人自杀,1个人笑着活下去. |