Lucky alive person in a circle | Code Solution to sword puzzle

Given n people standing in a circle where 1st is having sword, find the luckiest person in the circle, if from 1st soldier who is having a sword each have to kill the next soldier and handover the sword to next soldier, in turn the soldier will kill the adjacent soldier and handover the sword to next soldier such that one soldier remain in this war who is not killed by anyone.

Prerequisite : Puzzle 81 | 100 people in a circle with gun puzzle

Examples :

Input : 5
Output : 3
Explanation :
N = 5
Soldier 1 2 3 4 5 (5 soldiers)
In first go 1 3 5 (remains) as 2 and 4 killed by 1 and 3.
In second go 3 as 5 killed 1 and 3rd kill 5 soldier 3 remains alive.

Input : 100
Output : 73
Explanation :
N = 10
Soldiers 1 2 3 4 5 6 7 8 9 10 (10 soldiers)
In first 1 3 5 7 9 as 2 4 6 8 10 were killed by 1 3 5 7 and 9.
In second 1 5 9 as 9 kill 1 and in turn 5 kill 9th soldier.
In third 5 5th soldiers remain alive

Approach : The idea is to use circular linked list. A circular linked list is made based on number of soldier N. As rule state you have to kill your adjacent soldier and handover the sword to the next soldier who in turn kill his adjacent soldier and handover sword to the next soldier. So in circular linked list the adjacent soldier are killed and the remaining soldier fights against each other in a circular way and a single soldier survive who is not killed by anyone.

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// CPP code to find the luckiest person
#include <bits/stdc++.h>
using namespace std;
  
// Node structure
struct Node {
    int data;
    struct Node* next;
};
  
Node *newNode(int data)
{
   Node *node = new Node;
   node->data = data;
   node->next = NULL;
   return node;
}
  
// Function to find the luckiest person
int alivesol(int Num)
{
    if (Num == 1)
        return 1;
  
    // Create a single node circular
    // linked list.
    Node *last = newNode(1);
    last->next = last;
      
    for (int i = 2; i <= Num; i++) {
        Node *temp = newNode(i);
        temp->next = last->next;        
        last->next = temp;
        last = temp;     
    }
  
    // Starting from first soldier.
    Node *curr = last->next;
  
    // condition for evaluating the existence
    // of single soldier who is not killed.
    Node *temp;
    while (curr->next != curr) {
        temp = curr;
        curr = curr->next;
        temp->next = curr->next;
  
        // deleting soldier from the circular
        // list who is killed in the fight.
        delete curr;
        temp = temp->next;
        curr = temp;
    }
  
    // Returning the Luckiest soldier who
    // remains alive.
    int res = temp->data;
    delete temp;
      
    return res;
}
  
// Driver code
int main()
{
    int N = 100;
    cout << alivesol(N) << endl;
    return 0;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java code to find the luckiest person 
class GFG
{
      
// Node structure 
static class Node 
    int data; 
    Node next; 
}; 
  
static Node newNode(int data) 
    Node node = new Node(); 
    node.data = data; 
    node.next = null
    return node; 
  
// Function to find the luckiest person 
static int alivesol(int Num) 
    if (Num == 1
        return 1
  
    // Create a single node circular 
    // linked list. 
    Node last = newNode(1); 
    last.next = last; 
      
    for (int i = 2; i <= Num; i++) 
    
        Node temp = newNode(i); 
        temp.next = last.next;     
        last.next = temp; 
        last = temp;     
    
  
    // Starting from first soldier. 
    Node curr = last.next; 
  
    // condition for evaluating the existence 
    // of single soldier who is not killed. 
    Node temp = new Node(); 
    while (curr.next != curr) 
    
        temp = curr; 
        curr = curr.next; 
        temp.next = curr.next; 
  
        // deleting soldier from the circular 
        // list who is killed in the fight. 
        temp = temp.next; 
        curr = temp; 
    
  
    // Returning the Luckiest soldier who 
    // remains alive. 
    int res = temp.data; 
      
    return res; 
  
// Driver code 
public static void main(String args[]) 
    int N = 100
    System.out.println( alivesol(N) ); 
}
  
// This code is contributed by Arnab Kundu

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# code to find the luckiest person 
using System;
  
class GFG 
      
// Node structure 
public class Node 
    public int data; 
    public Node next; 
}; 
  
static Node newNode(int data) 
    Node node = new Node(); 
    node.data = data; 
    node.next = null
    return node; 
  
// Function to find the luckiest person 
static int alivesol(int Num) 
    if (Num == 1) 
        return 1; 
  
    // Create a single node circular 
    // linked list. 
    Node last = newNode(1); 
    last.next = last; 
      
    for (int i = 2; i <= Num; i++) 
    
        Node tem = newNode(i); 
        tem.next = last.next; 
        last.next = tem; 
        last = tem; 
    
  
    // Starting from first soldier. 
    Node curr = last.next; 
  
    // condition for evaluating the existence 
    // of single soldier who is not killed. 
    Node tem1 = new Node(); 
    while (curr.next != curr) 
    
        tem1 = curr; 
        curr = curr.next; 
        tem1.next = curr.next; 
  
        // deleting soldier from the circular 
        // list who is killed in the fight. 
        tem1 = tem1.next; 
        curr = tem1; 
    
  
    // Returning the Luckiest soldier who 
    // remains alive. 
    int res = tem1.data; 
      
    return res; 
  
// Driver code 
public static void Main(String []args) 
    int N = 100; 
    Console.WriteLine( alivesol(N) ); 
  
// This code is contributed by Arnab Kundu 

chevron_right


Output:

73


My Personal Notes arrow_drop_up

Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.



Improved By : andrew1234