Title | Canibales y misioneras en programación de un lenguaje |
---|---|
Author | Ruben Calle |
Course | Sistemas |
Institution | Escuela Militar de Ingeniería |
Pages | 6 |
File Size | 164.7 KB |
File Type | |
Total Downloads | 28 |
Total Views | 142 |
es un documento de que brindara ayuda a todos en general...
FICHA DE IDENTIFICACIÓN DE TRABAJO DE INVESTIGACIÓN Practica software sobre “caníbales y misioneros”
Título
Nombres y Apellidos
Autor/es
Ruben Calle Caceres
Fecha
31/08/2020
Carrera
Ingeniería de Sistemas
Asignatura
Sistemas inteligentes
Grupo
“A”
Docente
Ing. Roció Fanny carrasco Vergara
Periodo Académico
II/2020
Subsede
Oruro
Código de estudiantes 201306890
Copyright © (2019) por (Ruben Calle Caceres). Todos los derechos reservados.
#introduccion =begin
Tres misioneros y tres caníbales quieren cruzar un río. Solo hay una canoa que puede ser usada por una o dos personas, ya sean misioneros o caníbales. Hay que tener cuidado en que en ningún momento el número de caníbales supere al de misioneros en ninguna de las dos orillas, o se los comerán. =end # algunas constantes útiles para facilitar el trabajo con el vector Izq = 0 Der = 1 Canoa = 2 M=0 C=1
# todos a la izquierda, y la posición de la canoa Estado_ini = [ [ 3, 3 ], [ 0, 0 ], Izq ] # todos a la derecha, y la posición de la canoa Estado_fin = [ [ 0, 0 ], [ 3, 3 ], Der ]
# viajes posibles (misionero, caníbal) Viajes = [ [ 1, 0], [0, 1], [1, 1], [2, 0], [0, 2] ]
# devuelve si un estado es válido para las reglas del juego def valido?(estado) # logico, que no hayan de más o de menos if estado[Izq][M] > 3 || estado[Izq][M] < 0 ||
estado[Der][M] > 3 || estado[Der][M] < 0 || estado[Izq][C] > 3 || estado[Izq][C] < 0 || estado[Der][C] > 3 || estado[Der][C] < 0 return false # que no haya mas C que M a la Izq elsif estado[Izq][M] != 0 && estado[Izq][M] < estado[Izq][C] return false # que no haya mas C que M a la Der elsif estado[Der][M] != 0 && estado[Der][M] < estado[Der][C] return false end
# es OK true end
# cambia el estado según indica el viaje def canoa(estado, viaje) estado[estado[Canoa]][M] -= viaje[M] estado[estado[Canoa]][C] -= viaje[C]
if estado[Canoa] == Izq estado[Canoa] = Der else estado[Canoa] = Izq end
estado[estado[Canoa]][M] += viaje[M] estado[estado[Canoa]][C] += viaje[C] end
# una forma cómoda de mostrar el estado def muestraEstado(estado) printf("M:%d C:%d", estado[Izq][M], estado[Izq][C])
printf(" \\___/") if estado[Canoa] == Izq
printf(" ~~~~~~~~ ")
printf("\\___/ ") if estado[Canoa] == Der
printf("M:%d C:%d", estado[Der][M], estado[Der][C])
printf("\n") end
# para poder volver atrás viajes = Array.new anterior = Array.new # empezamos por el principio estado = Estado_ini # no duplicamos los vectores internos porque nos los mnodificamos posibles = Viajes.dup
# hasta que no acabemos, pega vueltas while estado != Estado_fin
if posibles == nil STDOUT.puts "NO he encontrado solucion!" exit end
# probamos viajes hasta que se nos acaben o uno sea válido while ! posibles.empty? viaje = posibles.shif
# duplicamos los vectores internos posibleEstado = [ estado[Izq].dup, estado[Der].dup, estado[Canoa] ] canoa(posibleEstado, viaje)
# salimos si es válido y no se ha repetido break if valido?(posibleEstado) && anterior.index(posibleEstado) == nil
# no es válido posibleEstado = nil end
# tenemos uno válido? if posibleEstado != nil # nos acordamos del estado actual anterior.push estado viajes.push posibles
# aceptamos el viaje como bueno (por ahora)
estado = posibleEstado posibles = Viajes.dup else # el viaje no nos ha llevado a un resultado # asi que recuperamos el estado anterior estado = anterior.pop posibles = viajes.pop
posibleEstado = nil end end
puts "Tenemos una solución!"
# muestra la solucion while (resultado = anterior.shif) != nil muestraEstado(resultado) end
muestraEstado(estado)
# EOF...