问题描述: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
例:
1次 | 0 1 2 3 4 5 6 | n=7,k=1,+1)%7 |
---|---|---|
2次 | 1 2 3 4 5 6 \ 0 1 2 3 4 5 | n=6,k=2,+2)%6 |
3次 | 2 3 4 5 0 0 1 2 3 4 | n=5,k=3,+3)%5 |
4次 | 3 4 0 1 0 1 2 3 | n=4,k=4,+4)%4 |
5次 | 0 1 2 0 1 2 | n=3,k=5,+5)%3 |
6次 | 原2 0 现0 1 | n=2,k=6,+6)%2 |
7次 | 0 |
比如,f(3,5)=(f(2,6)+5)%3 若f(2,6)现在的数字是0,则原来数字是2
private static int josephus_(int n, int m) {
if (n == 1) {
return 0;
} else {
return (josephus_(n-1, m+1) + m) % n;
}
}