fork download
  1. (defstruct estado
  2. ml cl ; misioneros y caníbales en la izquierda
  3. mr cr ; misioneros y caníbales en la derecha
  4. side ; 0 = bote a la izquierda, 1 = derecha
  5. camino) ; lista de pasos
  6.  
  7. (defun estado-valido-p (st)
  8. (let ((ml (estado-ml st))
  9. (cl (estado-cl st))
  10. (mr (estado-mr st))
  11. (cr (estado-cr st)))
  12. (and (>= ml 0) (<= ml 3)
  13. (>= cl 0) (<= cl 3)
  14. (>= mr 0) (<= mr 3)
  15. (>= cr 0) (<= cr 3)
  16. (or (= ml 0) (>= ml cl))
  17. (or (= mr 0) (>= mr cr)))))
  18.  
  19. (defun mover (st m c)
  20. (let* ((ml (estado-ml st))
  21. (cl (estado-cl st))
  22. (mr (estado-mr st))
  23. (cr (estado-cr st))
  24. (side (estado-side st)))
  25. (cond
  26. ((= side 0)
  27. (make-estado :ml (- ml m) :cl (- cl c)
  28. :mr (+ mr m) :cr (+ cr c)
  29. :side 1
  30. :camino (append (estado-camino st)
  31. (list (format nil "~dM~dC ->" m c)))))
  32. (t
  33. (make-estado :ml (+ ml m) :cl (+ cl c)
  34. :mr (- mr m) :cr (- cr c)
  35. :side 0
  36. :camino (append (estado-camino st)
  37. (list (format nil "~dM~dC <-" m c))))))))
  38.  
  39. (defun iguales (a b)
  40. (and (= (estado-ml a) (estado-ml b))
  41. (= (estado-cl a) (estado-cl b))
  42. (= (estado-mr a) (estado-mr b))
  43. (= (estado-cr a) (estado-cr b))
  44. (= (estado-side a) (estado-side b))))
  45.  
  46. (defun repetido-p (nuevo camino)
  47. (some (lambda (e) (iguales e nuevo)) camino))
  48.  
  49. (defparameter *viajes*
  50. '((2 0) (0 2) (1 1) (1 0) (0 1)))
  51.  
  52. (defun resolver (estado final camino)
  53. (when (iguales estado final)
  54. ;; Quitamos el push para no alterar la lista original y usamos list para mostrar
  55. (mostrar-solucion (reverse (cons estado camino)))
  56. (return-from resolver))
  57.  
  58. (dolist (v *viajes*)
  59. (let ((m (first v))
  60. (c (second v)))
  61. (let ((nuevo (mover estado m c)))
  62. (when (and (estado-valido-p nuevo)
  63. (not (repetido-p nuevo camino)))
  64. (resolver nuevo final (cons estado camino)))))))
  65.  
  66. (defun personas (m c)
  67. (concatenate 'string
  68. (make-string m :initial-element #\M)
  69. (make-string c :initial-element #\C)))
  70.  
  71. (defun lado-a-string (m c)
  72. (format nil "[~3a]" (personas m c)))
  73.  
  74. (defun mostrar-paso (anterior actual)
  75. (let ((ml (estado-ml anterior))
  76. (cl (estado-cl anterior))
  77. (mr (estado-mr anterior))
  78. (cr (estado-cr anterior))
  79. (side (estado-side anterior))
  80. (ml2 (estado-ml actual))
  81. (cl2 (estado-cl actual))
  82. (mr2 (estado-mr actual))
  83. (cr2 (estado-cr actual))
  84. (side2 (estado-side actual)))
  85.  
  86. (let* ((dm (- ml ml2))
  87. (dc (- cl cl2))
  88. (m (abs dm))
  89. (c (abs dc))
  90. (cruce (personas m c)))
  91. (format t "~%Paso ~a (antes de cruzar):~%" (+ 1 (length (estado-camino anterior))))
  92. ;; CORRECCIÓN AQUÍ: Reemplazamos [] por (lado-a-string mr cr)
  93. (if (= side 0)
  94. (format t "~a B ~~~~~~ ~a~%" (lado-a-string ml cl) (lado-a-string mr cr))
  95. (format t "~a ~~~~~~ B ~a~%" (lado-a-string ml cl) (lado-a-string mr cr)))
  96.  
  97. (format t "Cruzando con: ~a~%" cruce)
  98.  
  99. (format t "Paso ~a (después de cruzar):~%" (+ 1 (length (estado-camino anterior))))
  100. ;; CORRECCIÓN AQUÍ: Reemplazamos [] por (lado-a-string mr2 cr2)
  101. (if (= side2 0)
  102. (format t "~a B ~~~~~~ ~a~%" (lado-a-string ml2 cl2) (lado-a-string mr2 cr2))
  103. (format t "~a ~~~~~~ B ~a~%" (lado-a-string ml2 cl2) (lado-a-string mr2 cr2))))))
  104.  
  105. (defun mostrar-solucion (camino)
  106. (format t "~%====================================~%") ;traviesos
  107. (format t "Solución en ~d pasos~%" (1- (length camino)))
  108. (loop for (a b) on camino while b do
  109. (mostrar-paso a b))
  110. (format t "~%====================================~%"))
  111.  
  112. (defun main ()
  113. (let ((inicio (make-estado :ml 3 :cl 3 :mr 0 :cr 0 :side 0 :camino '()))
  114. (fin (make-estado :ml 0 :cl 0 :mr 3 :cr 3 :side 1 :camino '())))
  115. (resolver inicio fin '())))
  116.  
  117. (main)
Success #stdin #stdout 0.02s 30720KB
stdin
Standard input is empty
stdout
====================================
Solución en 11 pasos

Paso 1 (antes de cruzar):
[MMMCCC] B ~~~ [   ]
Cruzando con: CC
Paso 1 (después de cruzar):
[MMMC] ~~~ B [CC ]

Paso 2 (antes de cruzar):
[MMMC] ~~~ B [CC ]
Cruzando con: C
Paso 2 (después de cruzar):
[MMMCC] B ~~~ [C  ]

Paso 3 (antes de cruzar):
[MMMCC] B ~~~ [C  ]
Cruzando con: CC
Paso 3 (después de cruzar):
[MMM] ~~~ B [CCC]

Paso 4 (antes de cruzar):
[MMM] ~~~ B [CCC]
Cruzando con: C
Paso 4 (después de cruzar):
[MMMC] B ~~~ [CC ]

Paso 5 (antes de cruzar):
[MMMC] B ~~~ [CC ]
Cruzando con: MM
Paso 5 (después de cruzar):
[MC ] ~~~ B [MMCC]

Paso 6 (antes de cruzar):
[MC ] ~~~ B [MMCC]
Cruzando con: MC
Paso 6 (después de cruzar):
[MMCC] B ~~~ [MC ]

Paso 7 (antes de cruzar):
[MMCC] B ~~~ [MC ]
Cruzando con: MM
Paso 7 (después de cruzar):
[CC ] ~~~ B [MMMC]

Paso 8 (antes de cruzar):
[CC ] ~~~ B [MMMC]
Cruzando con: C
Paso 8 (después de cruzar):
[CCC] B ~~~ [MMM]

Paso 9 (antes de cruzar):
[CCC] B ~~~ [MMM]
Cruzando con: CC
Paso 9 (después de cruzar):
[C  ] ~~~ B [MMMCC]

Paso 10 (antes de cruzar):
[C  ] ~~~ B [MMMCC]
Cruzando con: M
Paso 10 (después de cruzar):
[MC ] B ~~~ [MMCC]

Paso 11 (antes de cruzar):
[MC ] B ~~~ [MMCC]
Cruzando con: MC
Paso 11 (después de cruzar):
[   ] ~~~ B [MMMCCC]

====================================

====================================
Solución en 11 pasos

Paso 1 (antes de cruzar):
[MMMCCC] B ~~~ [   ]
Cruzando con: CC
Paso 1 (después de cruzar):
[MMMC] ~~~ B [CC ]

Paso 2 (antes de cruzar):
[MMMC] ~~~ B [CC ]
Cruzando con: C
Paso 2 (después de cruzar):
[MMMCC] B ~~~ [C  ]

Paso 3 (antes de cruzar):
[MMMCC] B ~~~ [C  ]
Cruzando con: CC
Paso 3 (después de cruzar):
[MMM] ~~~ B [CCC]

Paso 4 (antes de cruzar):
[MMM] ~~~ B [CCC]
Cruzando con: C
Paso 4 (después de cruzar):
[MMMC] B ~~~ [CC ]

Paso 5 (antes de cruzar):
[MMMC] B ~~~ [CC ]
Cruzando con: MM
Paso 5 (después de cruzar):
[MC ] ~~~ B [MMCC]

Paso 6 (antes de cruzar):
[MC ] ~~~ B [MMCC]
Cruzando con: MC
Paso 6 (después de cruzar):
[MMCC] B ~~~ [MC ]

Paso 7 (antes de cruzar):
[MMCC] B ~~~ [MC ]
Cruzando con: MM
Paso 7 (después de cruzar):
[CC ] ~~~ B [MMMC]

Paso 8 (antes de cruzar):
[CC ] ~~~ B [MMMC]
Cruzando con: C
Paso 8 (después de cruzar):
[CCC] B ~~~ [MMM]

Paso 9 (antes de cruzar):
[CCC] B ~~~ [MMM]
Cruzando con: CC
Paso 9 (después de cruzar):
[C  ] ~~~ B [MMMCC]

Paso 10 (antes de cruzar):
[C  ] ~~~ B [MMMCC]
Cruzando con: C
Paso 10 (después de cruzar):
[CC ] B ~~~ [MMMC]

Paso 11 (antes de cruzar):
[CC ] B ~~~ [MMMC]
Cruzando con: CC
Paso 11 (después de cruzar):
[   ] ~~~ B [MMMCCC]

====================================

====================================
Solución en 11 pasos

Paso 1 (antes de cruzar):
[MMMCCC] B ~~~ [   ]
Cruzando con: MC
Paso 1 (después de cruzar):
[MMCC] ~~~ B [MC ]

Paso 2 (antes de cruzar):
[MMCC] ~~~ B [MC ]
Cruzando con: M
Paso 2 (después de cruzar):
[MMMCC] B ~~~ [C  ]

Paso 3 (antes de cruzar):
[MMMCC] B ~~~ [C  ]
Cruzando con: CC
Paso 3 (después de cruzar):
[MMM] ~~~ B [CCC]

Paso 4 (antes de cruzar):
[MMM] ~~~ B [CCC]
Cruzando con: C
Paso 4 (después de cruzar):
[MMMC] B ~~~ [CC ]

Paso 5 (antes de cruzar):
[MMMC] B ~~~ [CC ]
Cruzando con: MM
Paso 5 (después de cruzar):
[MC ] ~~~ B [MMCC]

Paso 6 (antes de cruzar):
[MC ] ~~~ B [MMCC]
Cruzando con: MC
Paso 6 (después de cruzar):
[MMCC] B ~~~ [MC ]

Paso 7 (antes de cruzar):
[MMCC] B ~~~ [MC ]
Cruzando con: MM
Paso 7 (después de cruzar):
[CC ] ~~~ B [MMMC]

Paso 8 (antes de cruzar):
[CC ] ~~~ B [MMMC]
Cruzando con: C
Paso 8 (después de cruzar):
[CCC] B ~~~ [MMM]

Paso 9 (antes de cruzar):
[CCC] B ~~~ [MMM]
Cruzando con: CC
Paso 9 (después de cruzar):
[C  ] ~~~ B [MMMCC]

Paso 10 (antes de cruzar):
[C  ] ~~~ B [MMMCC]
Cruzando con: M
Paso 10 (después de cruzar):
[MC ] B ~~~ [MMCC]

Paso 11 (antes de cruzar):
[MC ] B ~~~ [MMCC]
Cruzando con: MC
Paso 11 (después de cruzar):
[   ] ~~~ B [MMMCCC]

====================================

====================================
Solución en 11 pasos

Paso 1 (antes de cruzar):
[MMMCCC] B ~~~ [   ]
Cruzando con: MC
Paso 1 (después de cruzar):
[MMCC] ~~~ B [MC ]

Paso 2 (antes de cruzar):
[MMCC] ~~~ B [MC ]
Cruzando con: M
Paso 2 (después de cruzar):
[MMMCC] B ~~~ [C  ]

Paso 3 (antes de cruzar):
[MMMCC] B ~~~ [C  ]
Cruzando con: CC
Paso 3 (después de cruzar):
[MMM] ~~~ B [CCC]

Paso 4 (antes de cruzar):
[MMM] ~~~ B [CCC]
Cruzando con: C
Paso 4 (después de cruzar):
[MMMC] B ~~~ [CC ]

Paso 5 (antes de cruzar):
[MMMC] B ~~~ [CC ]
Cruzando con: MM
Paso 5 (después de cruzar):
[MC ] ~~~ B [MMCC]

Paso 6 (antes de cruzar):
[MC ] ~~~ B [MMCC]
Cruzando con: MC
Paso 6 (después de cruzar):
[MMCC] B ~~~ [MC ]

Paso 7 (antes de cruzar):
[MMCC] B ~~~ [MC ]
Cruzando con: MM
Paso 7 (después de cruzar):
[CC ] ~~~ B [MMMC]

Paso 8 (antes de cruzar):
[CC ] ~~~ B [MMMC]
Cruzando con: C
Paso 8 (después de cruzar):
[CCC] B ~~~ [MMM]

Paso 9 (antes de cruzar):
[CCC] B ~~~ [MMM]
Cruzando con: CC
Paso 9 (después de cruzar):
[C  ] ~~~ B [MMMCC]

Paso 10 (antes de cruzar):
[C  ] ~~~ B [MMMCC]
Cruzando con: C
Paso 10 (después de cruzar):
[CC ] B ~~~ [MMMC]

Paso 11 (antes de cruzar):
[CC ] B ~~~ [MMMC]
Cruzando con: CC
Paso 11 (después de cruzar):
[   ] ~~~ B [MMMCCC]

====================================