约瑟夫斯算法

时间:2015-07-27 15:33:55

标签: c++ c algorithm josephus

我正在阅读Josephus Problem的算法。

我遇到了以下算法:

int josephusIteration(int n,int k) {
    int a=1;
    for(int i=1;i<=n;i++) {
        a=(a+k-1)%i+1;
    }
    return a;
}

我无法理解它的逻辑。假设n = 5且k = 2。

i=1, a=1
i=2, a=1
i=3, a=3
i=4, a=1
i=5, a=3

有人可以举一个例子来解释这个吗?

1 个答案:

答案 0 :(得分:5)

如果n = 5k = 2,则安全位置为3。首先,位置2的人被杀,然后位置4的人被杀,然后位置1的人被杀死。最后,5号位的人被杀。所以第3位的人幸存下来。

我已阅读您的代码,但我想建议一个更容易理解的递归解决方案。

// this function returns the position of the person alive
int josephus(int n, int k)
{
  if (n == 1)
    return 1;
  else
    /* The position returned by josephus(n - 1, k) is adjusted because the
       recursive call josephus(n - 1, k) considers the original position 
       k%n + 1 as position 1 */
    return (josephus(n - 1, k) + k-1) % n + 1;
}

在第一个人(从开始的第k个)被杀之后,剩下n-1个人。所以我们打电话给josephus(n – 1, k)以获得n-1人的职位。

josephus(n – 1, k)返回的位置会从位置1再次考虑它。因此,我们将k-1添加到其中,并将其模数与n一起考虑n元素并添加1以使位置1-indexed而不是0-indexed

参考:http://www.geeksforgeeks.org/josephus-problem-set-1-a-on-solution/