首页 > 其他 > 详细

约瑟夫环

时间:2019-05-22 11:13:00      阅读:96      评论:0      收藏:0      [点我收藏+]

问题描述:n个人围成一圈,每隔k个杀死一个,问最后的幸存者的编号

假设标号是0~n-1,幸存者是f[n]

1、特殊情况:f[1]=0

2、一般情况:f[n] = (f[n-1]+k)%n

游戏开始时排序:

0、1、2、3、4、5、6、7、8……n-1

第一次被杀死的人的标号是k-1,还剩下n-1个人,此时的排序是:

k、k+1、k+2、k+3……n-1、0、1、2……k-3、k-2

重新排序:

0、1、2、3……n-5、n-4、n-3、n-2

    private static int josephus(int n, int m) {
        if (n == 1) {
            return 0;
        } else {
            return (josephus(n - 1, m) + m) % n;
        }
    }

问题描述:n个士兵围成一圈,从第一个开始报数,第i次报数时,报到i的士兵出局,问最后一个幸存的士兵的编号是多少

假设标号是0~n-1,幸存者是f[n, k]

1、特殊情况:f[1]=0

2、一般情况:f[n, k] = (f[n-1, k+1]+k)%n

例:

    0    1    2    3    4    5    6

1 × n=7,k=1,+0)%8
2 × n=6,k=2,+1)%7
3 × n=5,k=3,+2)%6
4 × n=4,k=4,+3)%5
5 × n=3,k=5,+4)%4
6 × n=2,k=6,+5)%3
7 √

    private static int josephus_(int n, int m) {
        if (n == 1) {
            return 0;
        } else {
            return (josephus_(n-1, m+1) + m) % n;
        }
    }

约瑟夫环

原文:https://www.cnblogs.com/angelica-duhurica/p/10903583.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!