C,
pasted
on Apr 28:
|
/* PRESOS.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,j,oidos,vistos;
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() {
/* Recorriendo la lista del 1 al 30, la estrategia para cada preso es:
* - escuchar el sombrero del primer preso y decodificarlo
* -si dijo blanco, ha visto un n£mero par de sombreros
* -si dijo negro, ha visto un n£mero impar de sombreros
* - llevar la cuenta de 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");
vistos=0;
for (i=2; i<=30; i++) {
vistos=vistos+sombrero[i];
}
eleccion[1]=vistos%2;
printf("El preso 1 ve %2i sombreros, y elige %i.\n",
vistos,eleccion[1]);
for (i=2; i<=30; i++) {
oidos=0;
for (j=2; j<i; j++) {
oidos=oidos+sombrero[j];
}
vistos=0;
for (j=i+1; j<=30; j++) {
vistos=vistos+sombrero[j];
}
if ((oidos+vistos)%2==eleccion[1])
eleccion[i]=0;
else
eleccion[i]=1;
printf("El preso %2i lleva contados %2i sombreros y ve %2i sombreros, luego elige %i.\n",
i,oidos,vistos,eleccion[i]);
}
}
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;
}
|
Output:
|
PRESOS Y SOMBREROS
Codificacion: 0-blanco 1-negro
Repartiendo sombreros...
101101101011111111110110101101
Aplicando estrategia (relativa a sombreros negros)...
Eleccion:
El preso 1 ve 21 sombreros, y elige 1.
El preso 2 lleva contados 0 sombreros y ve 21 sombreros, luego elige 0.
El preso 3 lleva contados 0 sombreros y ve 20 sombreros, luego elige 1.
El preso 4 lleva contados 1 sombreros y ve 19 sombreros, luego elige 1.
El preso 5 lleva contados 2 sombreros y ve 19 sombreros, luego elige 0.
El preso 6 lleva contados 2 sombreros y ve 18 sombreros, luego elige 1.
El preso 7 lleva contados 3 sombreros y ve 17 sombreros, luego elige 1.
El preso 8 lleva contados 4 sombreros y ve 17 sombreros, luego elige 0.
El preso 9 lleva contados 4 sombreros y ve 16 sombreros, luego elige 1.
El preso 10 lleva contados 5 sombreros y ve 16 sombreros, luego elige 0.
El preso 11 lleva contados 5 sombreros y ve 15 sombreros, luego elige 1.
El preso 12 lleva contados 6 sombreros y ve 14 sombreros, luego elige 1.
El preso 13 lleva contados 7 sombreros y ve 13 sombreros, luego elige 1.
El preso 14 lleva contados 8 sombreros y ve 12 sombreros, luego elige 1.
El preso 15 lleva contados 9 sombreros y ve 11 sombreros, luego elige 1.
El preso 16 lleva contados 10 sombreros y ve 10 sombreros, luego elige 1.
El preso 17 lleva contados 11 sombreros y ve 9 sombreros, luego elige 1.
El preso 18 lleva contados 12 sombreros y ve 8 sombreros, luego elige 1.
El preso 19 lleva contados 13 sombreros y ve 7 sombreros, luego elige 1.
El preso 20 lleva contados 14 sombreros y ve 6 sombreros, luego elige 1.
El preso 21 lleva contados 15 sombreros y ve 6 sombreros, luego elige 0.
El preso 22 lleva contados 15 sombreros y ve 5 sombreros, luego elige 1.
El preso 23 lleva contados 16 sombreros y ve 4 sombreros, luego elige 1.
El preso 24 lleva contados 17 sombreros y ve 4 sombreros, luego elige 0.
El preso 25 lleva contados 17 sombreros y ve 3 sombreros, luego elige 1.
El preso 26 lleva contados 18 sombreros y ve 3 sombreros, luego elige 0.
El preso 27 lleva contados 18 sombreros y ve 2 sombreros, luego elige 1.
El preso 28 lleva contados 19 sombreros y ve 1 sombreros, luego elige 1.
El preso 29 lleva contados 20 sombreros y ve 1 sombreros, luego elige 0.
El preso 30 lleva contados 20 sombreros y ve 0 sombreros, luego elige 1.
Mostrando resultado...
El preso 1 ha elegido 1 y su sombrero era 1, luego se salva.
El preso 2 ha elegido 0 y su sombrero era 0, luego se salva.
El preso 3 ha elegido 1 y su sombrero era 1, luego se salva.
El preso 4 ha elegido 1 y su sombrero era 1, luego se salva.
El preso 5 ha elegido 0 y su sombrero era 0, luego se salva.
El preso 6 ha elegido 1 y su sombrero era 1, luego se salva.
El preso 7 ha elegido 1 y su sombrero era 1, luego se salva.
El preso 8 ha elegido 0 y su sombrero era 0, luego se salva.
El preso 9 ha elegido 1 y su sombrero era 1, luego se salva.
El preso 10 ha elegido 0 y su sombrero era 0, luego se salva.
El preso 11 ha elegido 1 y su sombrero era 1, luego se salva.
El preso 12 ha elegido 1 y su sombrero era 1, luego se salva.
El preso 13 ha elegido 1 y su sombrero era 1, luego se salva.
El preso 14 ha elegido 1 y su sombrero era 1, luego se salva.
El preso 15 ha elegido 1 y su sombrero era 1, luego se salva.
El preso 16 ha elegido 1 y su sombrero era 1, luego se salva.
El preso 17 ha elegido 1 y su sombrero era 1, luego se salva.
El preso 18 ha elegido 1 y su sombrero era 1, luego se salva.
El preso 19 ha elegido 1 y su sombrero era 1, luego se salva.
El preso 20 ha elegido 1 y su sombrero era 1, luego se salva.
El preso 21 ha elegido 0 y su sombrero era 0, luego se salva.
El preso 22 ha elegido 1 y su sombrero era 1, luego se salva.
El preso 23 ha elegido 1 y su sombrero era 1, luego se salva.
El preso 24 ha elegido 0 y su sombrero era 0, luego se salva.
El preso 25 ha elegido 1 y su sombrero era 1, luego se salva.
El preso 26 ha elegido 0 y su sombrero era 0, luego se salva.
El preso 27 ha elegido 1 y su sombrero era 1, luego se salva.
El preso 28 ha elegido 1 y su sombrero era 1, luego se salva.
El preso 29 ha elegido 0 y su sombrero era 0, luego se salva.
El preso 30 ha elegido 1 y su sombrero era 1, luego se salva.
Se han salvado 30 y han ejecutado a 0.
|
|