proyecto

Iniciado por lesaxl, 20 Marzo 2019, 01:28 AM

0 Miembros y 1 Visitante están viendo este tema.

lesaxl

Un verdugo es mandado a exterminar a n prisioneros de guerra. El exterminio lo ejecuta de la
siguiente manera: los prisioneros forman un círculo alrededor del verdugo, el verdugo elige a
quien fusilar primero, una vez muerto el primero, la verdugo cuenta, a partir del lugar donde
estaba su última víctima, k prisioneros en orden de las manecillas del reloj, y luego fusila al késimo prisionero después de su última víctima (a los muertos no los cuenta), y repite este
proceso hasta que solo quede un prisionero. El último prisionero podrá ser liberado. El verdugo
tiene un amigo entre los n prisioneros, escribe un programa que, dado, n, k y la ubicación de su
amigo, le diga a quien fusilar primero, para asegurar que su amigo sea el que quede libre

este es el codigo pero el error es que a medida que se esta corriendo llega un momento que se queda pegado y me manda a cerrar , depurar o eliminar el programa .

ya lo revise pero no encuentro donde esta el problema

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

typedef struct _nodo
{
   int dato;
   struct _nodo *siguiente;
} tiponodo;

typedef tiponodo *pnodo;
typedef tiponodo *Lista;

void agregarPrisionero(Lista *l, int v);
void mostrarPrisioneros(Lista lista);
void fusilarPrisioneros(Lista *lista, int k, int n);
int getAmigo(int n, int k);

int main()
{
   int n, k,i;
   printf("Total de Prisioneros? :");
   scanf("%d",&n);
   printf( "Cada cuantos Prisioneros fusila? :");
   scanf("%d",&k);
   Lista lista = NULL;
   printf("Su amigo es el numero %d",getAmigo(n,k));
   for(i=0;i<n;i++)
      agregarPrisionero(lista, i);
   printf("Mostar Prisioneros: ");
   mostrarPrisioneros(lista);
   fusilarPrisioneros(lista, k, n);
   printf ("Mostar Sobreviviente: ");
   mostrarPrisioneros(lista);
   return 0;
}

int getAmigo(int n, int k)
{
   int v = -1, tam = n, y = 1,x;
   int amigo[n];
   amigo[0] = 0;
   for(x = (n-1); x > 0; x--)
   {
       amigo
  • = y;
           y++;
       }

       while(tam > 1)
       {
           for(y = 0; y < k; y++)
           {
               v++;
               while(v == n || amigo[v] == n)
               {
                   if(v == n)
                       v = 0;
                   else
                       v++;
               }
           }
           amigo[v] = n;
           tam--;
       }

       for(x = 0; x < n; x++)
           if(amigo
  • != n)
               return amigo
  • ;

       return 0;
    }

    void agregarPrisionero(Lista *lista, int v)
    {
       pnodo nodo;
       nodo = (pnodo)malloc(sizeof(tiponodo));
       nodo->dato = v;
       if(*lista == NULL)
           *lista = nodo;
       else
           nodo->siguiente = (*lista)->siguiente;
       (*lista)->siguiente = nodo;
    }

    void fusilarPrisioneros(Lista *lista, int k, int n)
    {
       pnodo nodo;
       nodo = *lista;
       int x;

       for(x = 0; x < (k-2); x++)
       {
           *lista = (*lista)->siguiente;
       }
       if(*lista == (*lista)->siguiente)
       {
           free(*lista);
           *lista = NULL;
       }else{
           nodo = (*lista)->siguiente;
           (*lista)->siguiente = nodo->siguiente;
           free(nodo);
       }
       if(n > 2)
       {
           *lista = (*lista)->siguiente;
           fusilarPrisioneros(lista, k, n-1);
       }
    }

    void mostrarPrisioneros(Lista lista)
    {
       pnodo nodo = lista;
       do{
          nodo->dato;
          nodo = nodo->siguiente;
       } while(nodo != lista);
    }