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
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);
}