Josephus Problem Solution in C Using Array

In computer science and mathematics, the Josephus Problem (or Josephus permutation) is a theoretical problem. Following is the problem statement:

There are n people standing in a circle waiting to be executed. The counting out begins at some point in the circle and proceeds around the circle in a fixed direction. In each step, a certain number of people are skipped and the next person is executed. The elimination proceeds around the circle (which is becoming smaller and smaller as the executed people are removed), until only the last person remains, who is given freedom. Given the total number of persons n and a number k which indicates that k-1 persons are skipped and kth person is killed in circle. The task is to choose the place in the initial circle so that you are the last one remaining and so survive.
For example, if n = 5 and k = 2, then the safe position is 3. Firstly, the person at position 2 is killed, then person at position 4 is killed, then person at position 1 is killed. Finally, the person at position 5 is killed. So the person at position 3 survives.
If n = 7 and k = 3, then the safe position is 4. The persons at positions 3, 6, 2, 7, 5, 1 are killed in order, and person at position 4 survives.

Attention reader! Don't stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.  To complete your preparation from learning a language to DS Algo and many more,  please refer Complete Interview Preparation Course .

In case you wish to attend live classes with experts, please refer DSA Live Classes for Working Professionals and Competitive Programming Live for Students.

The problem has following recursive structure.



          josephus(n, k) = (josephus(n - 1, k) + k-1) % n + 1   josephus(1, k) = 1

After the first person (kth from beginning) is killed, n-1 persons are left. So we call josephus(n – 1, k) to get the position with n-1 persons. But the position returned by josephus(n – 1, k) will consider the position starting from k%n + 1. So, we must make adjustments to the position returned by josephus(n – 1, k).

Following is simple recursive implementation of the Josephus problem. The implementation simply follows the recursive structure mentioned above.

C++

#include <iostream>

using namespace std;

int josephus( int n, int k)

{

if (n == 1)

return 1;

else

return (josephus(n - 1, k) + k - 1) % n + 1;

}

int main()

{

int n = 14;

int k = 2;

cout << "The chosen place is " << josephus(n, k);

return 0;

}

C

#include <stdio.h>

int josephus( int n, int k)

{

if (n == 1)

return 1;

else

return (josephus(n - 1, k) + k - 1) % n + 1;

}

int main()

{

int n = 14;

int k = 2;

printf ( "The chosen place is %d" , josephus(n, k));

return 0;

}

Java

import java.io.*;

class GFG {

static int josephus( int n, int k)

{

if (n == 1 )

return 1 ;

else

return (josephus(n - 1 , k) + k - 1 ) % n + 1 ;

}

public static void main(String[] args)

{

int n = 14 ;

int k = 2 ;

System.out.println( "The chosen place is "

+ josephus(n, k));

}

}

Python3

def josephus(n, k):

if (n = = 1 ):

return 1

else :

return (josephus(n - 1 , k) + k - 1 ) % n + 1

n = 14

k = 2

print ( "The chosen place is " , josephus(n, k))

C#

using System;

class GFG {

static int josephus( int n, int k)

{

if (n == 1)

return 1;

else

return (josephus(n - 1, k) + k - 1) % n + 1;

}

public static void Main()

{

int n = 14;

int k = 2;

Console.WriteLine( "The chosen "

+ "place is " + josephus(n, k));

}

}

PHP

<?php

function josephus( $n , $k )

{

if ( $n == 1)

return 1;

else

return (josephus( $n - 1, $k ) +

$k - 1) % $n + 1;

}

$n = 14;

$k = 2;

echo "The chosen place is " , josephus( $n , $k );

?>

Javascript

<script>

function josephus(n, k)

{

if (n == 1)

return 1;

else

return (josephus(n - 1, k)

+ k-1) % n + 1;

}

let n = 14;

let k = 2;

document.write( "The chosen " + "place is " + josephus(n, k));

</script>

Output

The chosen place is 13

Time Complexity: O(n)

Auxiliary Space: O(n)

Another Approach using List:

The simple approach is to create a list and add all values from 1 to n in it. Create a recursive function that takes list, start (position at which counting will start) and k ( number of person to be skipped) as argument. If size of list is one i.e. only one person left then return this position. Otherwise, start counting k person in clockwise direction from starting position and remove the person at kth position. Now the person at kth position is removed and now counting will start from this position. This process continues till only one person left.

pseudo-code :  Josephus( list , start , k){    if list.size = 1        return list[0]    start = (start + k) % list.size    list.remove( start )    return Josephus( list, start, k) }

C++ Code

C++

#include <bits/stdc++.h>

using namespace std;

void Josh(vector< int > person, int k, int index)

{

if (person.size() == 1) {

cout << person[0] << endl;

return ;

}

index = ((index + k) % person.size());

person.erase(person.begin() + index);

Josh(person, k, index);

}

int main()

{

int n = 14;

int k = 2;

k--;

int index

= 0;

vector< int > person;

for ( int i = 1; i <= n; i++) {

person.push_back(i);

}

Josh(person, k, index);

}

C#

using System;

using System.Collections.Generic;

class GFG {

static void Josh(List< int > person, int k, int index)

{

if (person.Count == 1) {

Console.WriteLine(person[0]);

return ;

}

index = ((index + k) % person.Count);

person.RemoveAt(index);

Josh(person, k, index);

}

static void Main()

{

int n = 14;

int k = 2;

k--;

int index

= 0;

List< int > person = new List< int >();

for ( int i = 1; i <= n; i++) {

person.Add(i);

}

Josh(person, k, index);

}

}

Time Complexity: O(n)

Example :

Input : n = 5,  k = 2 output : 3

Explanation :

Add all values from 1 to n in the list. We will call the recursive function with start = 0 and k = 1 (0-indexing)

Now the element at 1-index (person number 2) will be killed. And it is removed from list. The new counting will begins from 1-index, person at 1-index killed so now person at 2-index (person number 3) comes to 1-index and counting starts from here now.

Now we have 4 person, counting start from 1-index (person number 3) and the person at kth (2-index ) position will be killed.

The person at 2-index (person number 4) killed so now we have 3 person left and the person (person number 5) at 3-index shifted to 2-index. And counting starts from here.


The person at 0-index killed and we have now two person left in the circle. And the person at 1-index shifted to 0-index i.e. person number 3.

Final counting done and person at 1-index killed and only person who is left is at position 3.

This is a solution to the Josephus problem in C++.

For n = 47 and k = 5.

C++

#include <bits/stdc++.h>

using namespace std;

int Josephus( int , int );

int main()

{

int n, k;

cin >> n >> k;

cout << Josephus(n, k);

return 0;

}

int Josephus( int n, int k)

{

k--;

int arr[n];

for ( int i = 0; i < n; i++) {

arr[i] = 1;

}

int cnt = 0, cut = 0,

num = 1;

while (

cnt

< (n - 1))

{

while (num <= k)

{

cut++;

cut = cut % n;

if (arr[cut] == 1) {

num++;

}

}

num = 1;

arr[cut]

= 0;

cnt++;

cut++;

cut = cut

% n;

while (arr[cut]

== 0)

{

cut++;

cut = cut % n;

}

}

return cut + 1;

}

If you guys liked it, please comment and help me with further improvements.

Output

The safe position : 4

Josephus problem | Set 2 (A Simple Solution when k = 2)

Source:
http://en.wikipedia.org/wiki/Josephus_problem

Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.


Josephus Problem Solution in C Using Array

Source: https://www.geeksforgeeks.org/josephus-problem-set-1-a-on-solution/

0 Response to "Josephus Problem Solution in C Using Array"

Post a Comment

Iklan Atas Artikel

Iklan Tengah Artikel 1

Iklan Tengah Artikel 2

Iklan Bawah Artikel