codepad
[
create a new paste
]
login
|
about
Language:
C
C++
D
Haskell
Lua
OCaml
PHP
Perl
Plain Text
Python
Ruby
Scheme
Tcl
/* PRESOS5.C * PRESOS Y SOMBREROS * Los presos se representan como una tabla de enteros que podra * tener dos valores: 0-sombrero blanco, o 1-sombrero negro. * La elección de cada preso se representa como otra tabla de * enteros siguiendo la misma codificación. */ #include<stdio.h> #include<stdlib.h> #include<time.h> #include<math.h> int i,e; int sombrero[31]; int eleccion[31]; int salvados; int ejecutados; main() { printf("PRESOS Y SOMBREROS\n"); printf("Codificacion: 0-blanco 1-negro\n"); Repartir_sombreros(); Aplicar_estrategia(); Mostrar_resultado(); } Repartir_sombreros() { /* Aleatoriamente se asignan sobreros a cada uno de los 30 presos. */ printf("Repartiendo sombreros...\n"); srand(time(0)); for (i=1; i<=30; i++) { sombrero[i]= rand()%2; printf("%i",sombrero[i]); } printf("\n"); } Aplicar_estrategia() { /* Se aplica un algoritmo recursivo que va llamando cada vez a un caso * mas simple, que sera la respuesta del anterior preso. * - en el caso base, la respuesta del primer preso depende de si es par o * impar el número de sombreros negros que ve. * -si dijo blanco, ha visto un n£mero par de sombreros * -si dijo negro, ha visto un n£mero impar de sombreros * - en otro caso, * - hará una llamada a la función Respuesta para escuchar la * respuesta del preso anterior. * - contará los sombreros negros que han ido diciendo sus compañeros, * quitando el primero, que habrán ido acertando. * - si la suma de los que ha oido mas los que ve es del mismo orden * (par o impar) que los que vio el primer preso, entonces * elegir blanco * -sino * elegir negro */ printf("Aplicando estrategia (relativa a sombreros negros)...\n"); printf("Eleccion:\n"); e=Respuesta(30); } void Respuesta (int i) { int j,oidos,vistos,r; vistos=0; for (j=i+1; j<=30; j++) { vistos=vistos+sombrero[j]; } if (i==1) { r=vistos%2; printf("El preso 1 ve %2i sombreros, y elige %i.\n", vistos,r); } else { Respuesta(i-1); oidos=0; for (j=2; j<i; j++) { oidos=oidos+eleccion[j]; } if ((oidos+vistos)%2==eleccion[1]%2) r=0; else r=1; printf("El preso %2i lleva contados %2i sombreros y ve %2i sombreros, luego elige %i.\n", i,oidos,vistos,r); } eleccion[i]=r; return 0; } Mostrar_resultado() { /* Se muestra el resultado comparando las respuesta de cada preso con el sombrero que * lleva, indicando si coincide (y se salva) o no (y le matan). */ printf("Mostrando resultado...\n"); salvados=0; ejecutados=0; for (i=1; i<=30; i++) { printf("El preso %2i ha elegido %i y su sombrero era %i",i,eleccion[i],sombrero[i]); if (eleccion[i]==sombrero[i]) { printf(", luego se salva.\n"); salvados++; } else { printf(", luego le matan.\n"); ejecutados++; } } printf("Se han salvado %i y han ejecutado a %i.\n",salvados,ejecutados); return 0; }
Private
[
?
]
Run code
Submit