Canibales y misioneras en programación de un lenguaje PDF

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 PDF
Total Downloads 28
Total Views 142

Summary

es un documento de que brindara ayuda a todos en general...


Description

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...


Similar Free PDFs