约瑟夫(josephus)环:假设有n个小孩坐成一个环,并且从第一个小孩开始数, 如果数到m个小孩,则该小该离开,问最后留下的小孩是第几个小孩?
例如:总共有6个小孩,围成一圈,从第一个小孩开始,每次数2个小孩。
游戏情况如下: 小孩序号:1,2,3,4,5,6 离开小孩序号:2,4,6,3,1 最后获胜小孩序号:5
1、简单办法:(如果只要求输出最后获胜的小孩编号,以下办法可以采用---具体数学第一章有一节专门讲这个的)
2、以下用链表处理约瑟夫环问题(代码仅为参考,没设置密码位,即至始至终m值是不变的)
如果题目要求每个人手里有一个密码,当这个人离开时,他应该将自己的密码赋值给m,然后输出自己,那么法一实现起来就并不那么容易了。这是使用单循环链表无疑是一个非常不错的选择。
单循环链表,模拟了人的组织结构----一圈,并且不需要因为哪个人被踢出去,改变已有的组织结构(只需要动态删除即可),也不需要设置标志位。
对于链表中的每个人,我们可以考虑给其一个结构,内含有这个人的编号,以及密码。当然,我们也可以设置一个全局的结构保存,共有多少个人,已经出去了多少人,为了后来新的需求:假设剩下k个人后,程序就停止。