Lucky alive person in a circle | Code Solution to sword puzzle
Last Updated :
05 Aug, 2022
Given n people standing in a circle where 1st has a sword, find the luckiest person in the circle, if, from 1st soldier who is has a sword each has 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 remains in this war who is not killed by anyone.
Prerequisite: Puzzle 81 | 100 people in a circle with a 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 a circular linked list. A circular linked list is made based on a number of soldiers N. As the rule state you have to kill your adjacent soldier and hand over the sword to the next soldier who in turn kills his adjacent soldier and hand over the sword to the next soldier. So in the circular linked list, the adjacent soldier is killed and the remaining soldier fights against each other in a circular way and a single soldier survives who is not killed by anyone.
Implementation:
C++
#include <bits/stdc++.h>
using namespace std;
struct Node {
int data;
struct Node* next;
};
Node *newNode( int data)
{
Node *node = new Node;
node->data = data;
node->next = NULL;
return node;
}
int alivesol( int Num)
{
if (Num == 1)
return 1;
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;
}
Node *curr = last->next;
Node *temp;
while (curr->next != curr) {
temp = curr;
curr = curr->next;
temp->next = curr->next;
delete curr;
temp = temp->next;
curr = temp;
}
int res = temp->data;
delete temp;
return res;
}
int main()
{
int N = 100;
cout << alivesol(N) << endl;
return 0;
}
|
Java
class GFG
{
static class Node
{
int data;
Node next;
};
static Node newNode( int data)
{
Node node = new Node();
node.data = data;
node.next = null ;
return node;
}
static int alivesol( int Num)
{
if (Num == 1 )
return 1 ;
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;
}
Node curr = last.next;
Node temp = new Node();
while (curr.next != curr)
{
temp = curr;
curr = curr.next;
temp.next = curr.next;
temp = temp.next;
curr = temp;
}
int res = temp.data;
return res;
}
public static void main(String args[])
{
int N = 100 ;
System.out.println( alivesol(N) );
}
}
|
Python3
class Node:
def __init__( self , data):
self .data = data
self . next = None
def newNode(data):
node = Node(data)
return node
def alivesol( Num):
if (Num = = 1 ):
return 1 ;
last = newNode( 1 );
last. next = last;
for i in range ( 2 , Num + 1 ):
temp = newNode(i);
temp. next = last. next ;
last. next = temp;
last = temp;
curr = last. next ;
temp = None
while (curr. next ! = curr):
temp = curr;
curr = curr. next ;
temp. next = curr. next ;
del curr;
temp = temp. next ;
curr = temp;
res = temp.data;
del temp;
return res;
if __name__ = = '__main__' :
N = 100 ;
print (alivesol(N))
|
C#
using System;
class GFG
{
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;
}
static int alivesol( int Num)
{
if (Num == 1)
return 1;
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;
}
Node curr = last.next;
Node tem1 = new Node();
while (curr.next != curr)
{
tem1 = curr;
curr = curr.next;
tem1.next = curr.next;
tem1 = tem1.next;
curr = tem1;
}
int res = tem1.data;
return res;
}
public static void Main(String []args)
{
int N = 100;
Console.WriteLine( alivesol(N) );
}
}
|
Javascript
<script>
class Node
{
constructor()
{
this .data = 0;
this .next = null ;
}
}
function newNode(data)
{
var node = new Node();
node.data = data;
node.next = null ;
return node;
}
function alivesol(Num)
{
if (Num == 1)
return 1;
var last = newNode(1);
last.next = last;
for ( var i = 2; i <= Num; i++)
{
var tem = newNode(i);
tem.next = last.next;
last.next = tem;
last = tem;
}
var curr = last.next;
var tem1 = new Node();
while (curr.next != curr)
{
tem1 = curr;
curr = curr.next;
tem1.next = curr.next;
tem1 = tem1.next;
curr = tem1;
}
var res = tem1.data;
return res;
}
var N = 100;
document.write(alivesol(N) + "<br>" );
</script>
|
Time Complexity: O(n), as we are using a loop to traverse n times. Where n is the number of nodes in the linked list.
Auxiliary Space: O(n), as we are using extra space for the linked list. Where n is the number of the nodes in the linked list.
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...