约瑟夫(Joseph)问题的解决方法
问题描述
最初Joseph问题是这样的:有n个人(分别编号1,2……n)围成一圈,这些人轮流数数(编号为1的人开始,从1开始数),当数到m的人就会被处决。接着,后面的人继续从1开始数数,如此下去直到最后剩下来的那个人才能活命。当然Joseph先生非常聪明,他总是选择能最后剩下的那个位置站位。
用图示来阐述Joseph问题更加直观:如下图,假如有A,B……E共五个人(为了方便描述,这里用字母来对每个人编号),m= 3(即数到3的人出去);则第一个被处决的人是C,接着D报1,E报2,然后A报3,于是A被处决,如此进行下去,E,B又先后被处决,最后活下来的是D,因此最后输出答案就是D(或者输出其下标:3)。
解法一:模拟法
实现:
求解约瑟夫问题最直观(但非最高效)的方法就是直接模拟了。借助循环链表(或者数组模拟的循环链表)来表示约瑟夫环,然后就模拟数数过程,当数到m时就将该元素从循环链表中删除,直到循环链表中只剩一个元素为止!在这里我用数组来模拟循环链表,从而实现约瑟夫环问题的求解,代码如下: