黑马程序员技术交流社区

标题: Josephus问题求解 [打印本页]

作者: 兰海忠    时间: 2011-7-26 23:35
标题: Josephus问题求解
还上学的时候老师讲了这个问题但没有注意,去年面试的时候就出了这道题上机写代码,通过了再笔试,结果自己弄了半天没有弄出来,自己灰溜溜的走了。现在敢问各位大侠这题是什么解的。问题是这样的:说一群小孩子围成一圈,任意假定一个数M,从第一个孩子开始器,顺时针方向数,每数到M的小孩时,该小孩子离开。从下一个孩子开始又开始重新数,也是到M时孩子离开。孩子不断离开,圈子变小。请问最后离开的孩子是第几个孩子。 希望大家能解决一下详细点的,本人比较愚钝希望说具体点。谢谢!
作者: 匿名    时间: 2011-7-27 08:59
约瑟夫环问题,可以用递归和链表实现。人为的构造个循环链表,递归到只剩一个孩子就行了
作者: 匿名    时间: 2011-7-27 09:15
首先,建立一个数组array,长度为孩子的数量。 数组的每个元素的值,就是孩子的位置编号,从1开始编号。
第二,建立一个统计变量count,计算当前数组中还剩余的孩子的数量。
第三,若剩余人数大于1,则孩子们,开始报数。
第四,若某个孩子,报出了关键数字,则将count-1,然后将array[该孩子的下标] = 0,即报出关键数字的孩子,将离开,咱们把他的号码,置为0,就意味着他离开了。
第五,只有号码不为0的孩子,才可以参与报数。
第六,建立一个报数时需要使用的变量temp,用于保存当前孩子需要报的数字。
第七,最后,数组中,元素值不为0的那个元素,就是剩下的那个孩子的,编号。

废话少说,看代码:[code=java]package org.cxy.demo;

public class Children {
        private int[] child;
        private int count;
        public Children(int max){
                this.child = new int[max];
                for(int i=0;i<this.child.length;i++){
                        this.child[i] = i+1;
                        this.count++;
                }
        }
        public int quitByNumber(int number){
                int temp = 1;
                // 若剩余的孩子数大于1,则游戏继续。
                while(this.count>1){
                        for(int i=0;i<this.child.length;i++){
                                if(this.child[i]!=0){
                                        System.out.printf("第 %d 个孩子,报数为:%d\n",this.child[i],(temp%number == 0 ?number:temp%number));
                                        if(temp%number == 0){
                                                System.out.printf("哦啊,第 %d 个孩子,离开了!\n",this.child[i]);
                                                this.child[i] = 0;
                                                this.count--;
                                        }
                                        temp++;
                                }
                        }
                }
                for(int i=0;i<this.child.length;i++){
                        if(this.child[i]!=0){
                                return this.child[i];
                        }
                }
                return -1;
        }
        public static void main(String[] args) {
                Children c = new Children(13);
                System.out.printf("最终留下来的是第 %d 个孩子!\n",c.quitByNumber(3));
        }
}[/code]程序执行结果:[code=java]第 1 个孩子,报数为:1
第 2 个孩子,报数为:2
第 3 个孩子,报数为:3
哦啊,第 3 个孩子,离开了!
第 4 个孩子,报数为:1
第 5 个孩子,报数为:2
第 6 个孩子,报数为:3
哦啊,第 6 个孩子,离开了!
第 7 个孩子,报数为:1
第 8 个孩子,报数为:2
第 9 个孩子,报数为:3
哦啊,第 9 个孩子,离开了!
第 10 个孩子,报数为:1
第 11 个孩子,报数为:2
第 12 个孩子,报数为:3
哦啊,第 12 个孩子,离开了!
第 13 个孩子,报数为:1
第 1 个孩子,报数为:2
第 2 个孩子,报数为:3
哦啊,第 2 个孩子,离开了!
第 4 个孩子,报数为:1
第 5 个孩子,报数为:2
第 7 个孩子,报数为:3
哦啊,第 7 个孩子,离开了!
第 8 个孩子,报数为:1
第 10 个孩子,报数为:2
第 11 个孩子,报数为:3
哦啊,第 11 个孩子,离开了!
第 13 个孩子,报数为:1
第 1 个孩子,报数为:2
第 4 个孩子,报数为:3
哦啊,第 4 个孩子,离开了!
第 5 个孩子,报数为:1
第 8 个孩子,报数为:2
第 10 个孩子,报数为:3
哦啊,第 10 个孩子,离开了!
第 13 个孩子,报数为:1
第 1 个孩子,报数为:2
第 5 个孩子,报数为:3
哦啊,第 5 个孩子,离开了!
第 8 个孩子,报数为:1
第 13 个孩子,报数为:2
第 1 个孩子,报数为:3
哦啊,第 1 个孩子,离开了!
第 8 个孩子,报数为:1
第 13 个孩子,报数为:2
第 8 个孩子,报数为:3
哦啊,第 8 个孩子,离开了!
第 13 个孩子,报数为:1
最终留下来的是第 13 个孩子![/code]




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2