だから私は 8 パズルの A* 検索を行っていますが、うまくいくように見えますが、問題は、解決策が見つかると優先順位マップを通過し続け、すべての可能性を出力することです。条件を満たしたときに停止して出力する方法はありますか?
注: doseq を for ループで遅延させ、それらを評価しないようにするのが最善の方法だと思います。これを行う方法はありますか?
ここに私のコードがあります:
(defn a-star
([board history]
(if (at-end? board) (print-board board)
(let [options (filter #(possible-move? % board) *moves*)
move (into (pm/priority-map) (for [move options] [move (global-man-dis (move-tile board move))]))]
(doseq [pair move :let [next-move (key pair)]]
(print-board (move-tile board next-move))
(println)
(a-star (move-tile board next-move) next-move (conj history board))
)
)
))
([board prev-move history]
(if (or (at-end? board) (history-check history board)) (print-board board)
(let [options (get-queue board (dont-go-back prev-move))
move (into (pm/priority-map) (for [move options] [move (global-man-dis (move-tile board move))]))]
(doseq [pair move :let [next-move (key pair)]]
(print-board (move-tile board next-move))
(println)
(a-star (move-tile board next-move) next-move (conj history board))
)
)
)))
(defn -main [& args]
(println "insert a list all numbers no spaces or letters")
(def board (mapv (fn [^Character c] (Character/digit c 10)) (read-line)))
;(def testt [0 8 4 7 2 1 3 5 6])
;(def testt [1 2 3 5 4 6 8 0 7])
(a-star board [])
)