-3

空の 5 ガロンの水差しと空の 11 ガロンの水差しから始めて、どうすれば 11 ガロンの水差しに正確に 3 ガロンの水を入れ、5 ガロンの水差しを空にすることができるでしょうか?

このパズルの任意の状態の後続状態のリストを計算する関数を Lisp で書きたい

私の解決策

(0 0) > (5 0) > (0 5) > (5 5) > (0 10 ) > (5 10)>(4 11)>(4 0)>(0 4)>(5 4)>(0 9)>(5 9)>(3 11)>(3 0)>(0 3)

successors関数を実装するにはどうすればよいですか?

        (setq initial-state '(0 0))
    (setq fill-jug1-state '(5 0))
    (setq fill-jug2-state '(0 11))
    (setq full '(5 11))
    (defparameter *jug-1* 5) 
    (defparameter *jug-2* 11)
    (defun successors (initial-state)

)

助けてください !!!!

4

1 に答える 1

1

開始するためのヒントは次のとおりです。

(defun successors (state)        ; for each state
  (let ((jug1 (first state))     ; gallons in jug1 for state
        (jug2 (second state))    ; gallons in jug2 for state
        (new-states nil))        ; successor states of state
    (when (< jug1 5)             ; if jug1 is not full
      (push (list 5 jug2) new-states))  ; then fill jug1
    ; do the same for jug2
    ; ...
    (when (> jug1 0)             ; if jug1 has some water
      ;...                         empty jug1, that is, new-state = (0 jug2)
    ; do the same for jug2 if jug2 has some water
    ;...
    (when (and (> jug2 0) (< jug1 5)) ; if jug2 can give water to jug1
      ; then pour the water of jug2 in jug1
      (push (list (min 5 (+ jug1 jug2))
                  (max (- jug2 (- 5 jug1)) 0)) new-states))
    ; do the same for the opposite situation
    ;...
    new-states))              ; finally return the set of new states
于 2015-08-12T20:13:22.187 に答える