Suerte persona viva en un círculo | Solución de código para el rompecabezas de la espada

Dadas n personas paradas en un círculo donde el primero tiene una espada, encuentre a la persona más afortunada en el círculo, si, del primer soldado que tiene una espada, cada uno tiene que matar al siguiente soldado y entregar la espada al siguiente soldado, a su vez, el el soldado matará al soldado adyacente y le entregará la espada al próximo soldado de modo que un soldado permanezca en esta guerra que no sea asesinado por nadie.
Prerrequisito: Rompecabezas 81 | Puzzle de 100 personas en círculo con una pistola

Ejemplos: 

Entrada: 5 
Salida: 3 
Explicación: 
N = 5 
Soldado 1 2 3 4 5 (5 soldados) 
En el primer intento 1 3 5 (permanece) como 2 y 4 asesinados por 1 y 3. 
En el segundo intento 3 como 5 asesinados 1 y 3. matar a 5 soldado 3 sigue vivo.

Entrada: 100 
Salida: 73 
Explicación: 
N = 10 
Soldados 1 2 3 4 5 6 7 8 9 10 (10 soldados) 
En el primero 1 3 5 7 9 como 2 4 6 8 10 fueron asesinados por 1 3 5 7 y 9. 
En segundo 1 5 9 como 9 matan a 1 ya su vez 5 matan al noveno soldado. 
En tercero 5 5to soldados siguen vivos

Enfoque: La idea es utilizar una lista enlazada circular . Se hace una lista enlazada circular basada en un número de soldados N. Como regla general, debe matar a su soldado adyacente y entregar la espada al siguiente soldado, quien a su vez mata a su soldado adyacente y entrega la espada al siguiente soldado. . Entonces, en la lista enlazada circular, el soldado adyacente muere y el soldado restante lucha entre sí de forma circular y sobrevive un solo soldado que no es asesinado por nadie. 

C++

// C++ 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;
}

Java

// 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

Python3

# Python3 code to find the luckiest person
  
# Node structure
class Node:
     
    def __init__(self, data):
        self.data = data
        self.next = None
     
def newNode(data): 
    node = Node(data)
    return node
  
# Function to find the luckiest person
def alivesol( Num):
    if (Num == 1):
        return 1;
  
    # Create a single node circular
    # linked list.
    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;    
      
    # Starting from first soldier.
    curr = last.next;
  
    # condition for evaluating the existence
    # of single soldier who is not killed.
    temp = None
     
    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.
        del curr;
        temp = temp.next;
        curr = temp;
  
    # Returning the Luckiest soldier who
    # remains alive.
    res = temp.data;
    del temp;    
    return res;
  
# Driver code
if __name__=='__main__':
     
    N = 100;
    print(alivesol(N))
    
  # This code is contributed by rutvik_56

C#

// 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

Javascript

<script>
 
// JavaScript code to find the luckiest person
 
// Node structure
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 to find the luckiest person
function alivesol(Num)
{
    if (Num == 1)
        return 1;
     
    // Create a single node circular
    // linked list.
    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;
    }
     
    // Starting from first soldier.
    var curr = last.next;
     
    // Condition for evaluating the existence
    // of single soldier who is not killed.
    var 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.
    var res = tem1.data;
     
    return res;
}
 
// Driver code
var N = 100;
document.write(alivesol(N) + "<br>");
 
// This code is contributed by rdtank
 
</script>
Producción: 

73

 

Complejidad de tiempo: O (n), ya que estamos usando un bucle para atravesar n veces. Donde n es el número de Nodes en la lista enlazada.

Espacio auxiliar: O(n), ya que estamos usando espacio extra para la lista enlazada. Donde n es el número de Nodes en la lista enlazada.

Publicación traducida automáticamente

Artículo escrito por AnupGaurav y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *