Título: proyecto Publicado por: lesaxl en 20 Marzo 2019, 01:28 am 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
} 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
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); } |