📜  约瑟夫斯问题 | (迭代解决方案)

📅  最后修改于: 2021-09-24 04:56:53             🧑  作者: Mango

有 N 个孩子坐在 N 把椅子上,围成一圈。椅子从 1 到 N 编号。游戏开始循环,从第一把椅子开始数孩子。一旦计数达到 K,那个孩子就离开游戏,移开他/她的椅子。游戏再次开始,从圆圈中的下一张椅子开始。最后留在圆圈中的孩子是赢家。找到赢得比赛的孩子。

例子:

Input : N = 5, K = 2
Output : 3
Firstly, the child at position 2 is out, 
then position 4 goes out, then position 1
Finally, the child at position 5 is out. 
So the position 3 survives.

Input : 7 4
Output : 2

我们已经讨论了约瑟夫斯问题的递归解决方案。给定的解决方案比不适合大输入的 Josephus 解决方案的递归解决方案更好,因为它会导致堆栈溢出。时间复杂度为 O(N)。

方法– 在算法中,我们使用 sum 变量来找出要移除的椅子。当前椅子位置是通过将椅子计数 K 加到先前位置(即总和和总和的模数)来计算的。最后我们返回 sum+1,因为编号从 1 到 N。

C++
// Iterative solution for Josephus Problem 
#include 
using namespace std;
  
// Function for finding the winning child.
long long int find(long long int n, long long int k)
{
    long long int sum = 0, i;
  
    // For finding out the removed 
    // chairs in each iteration
    for (i = 2; i <= n; i++)
        sum = (sum + k) % i;
  
    return sum + 1;
}
  
// Driver function to find the winning child
int main()
{
    int n = 14, k = 2;
    cout << find(n, k);
    return 0;
}


Java
// Iterative solution for Josephus Problem
class Test 
{
  
    // Method for finding the winning child.
    private int josephus(int n, int k) 
    {
        int sum = 0;
  
        // For finding out the removed 
        // chairs in each iteration 
        for(int i = 2; i <= n; i++) 
        {
            sum = (sum + k) % i;
        }
  
        return sum+1;
    }
  
    // Driver Program to test above method 
    public static void main(String[] args)
    { 
        int n = 14; 
        int k = 2; 
        Test obj = new Test();
        System.out.println(obj.josephus(n, k)); 
    }
}
  
// This code is contributed by Kumar Saras


输出:
13

如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程学生竞争性编程现场课程