这个是维基百科上的一段代码,经试验可以解数独。
链接:https://zh.wikipedia.org/wiki/Clojure#cite_note-:8-7
(def board [[0 2 0 0 0 5 0 0 7] [0 8 0 2 0 4 0 0 0] [7 0 0 0 0 0 0 0 6] [0 0 7 0 1 0 0 3 0] [9 0 0 0 5 0 0 0 0] [0 0 5 0 0 0 2 7 0] [0 0 0 1 0 7 6 8 0] [0 0 0 0 9 0 0 0 2] [0 0 0 6 0 3 7 5 0]]) (defn board-rows [board] (let [full-set (set (range 1 10)) exists (mapv #(remove (partial == 0) %) board)] (mapv #(clojure.set/difference full-set (set %)) exists))) (defn board-cols [board] (let [board-v (for [i (range 9)] (map #(% i) board))] (board-rows board-v))) (defn board-blks [board] (let [board-b (for [i (range 3) j (range 3)] (for [k (range 3) l (range 3) :let [x (+ k (* i 3)) y (+ l (* j 3))]] (get-in board [x y])))] (board-rows board-b))) (defn board-tofill [board] (vec (for [i (range 9) j (range 9) :let [v (get-in board [i j])] :when (== v 0)] [i j]))) (defn blk-ix [x y] (let [i (quot x 3) j (quot y 3)] (+ j (* i 3)))) (defn fill-cand [x y rows cols blks] (let [row (get rows x) col (get cols y) blk (get blks (blk-ix x y))] (clojure.set/intersection row col blk))) (defn solve-sudoku ([tofill rows cols blks board] (if (empty? tofill) board (let [cands (for [i (range (count tofill)) :let [[x y] (get tofill i) cand (fill-cand x y rows cols blks)]] [i x y cand]) [mk x y min-cand] (apply min-key #(count (peek %)) cands) tofill-update (vec (concat (take mk tofill) (drop (inc mk) tofill))) ] (when (not (empty? min-cand)) (apply concat (for [cand min-cand :let [cand-set #{cand} remove-cand (fn [s i] (update-in s [i] #(clojure.set/difference % cand-set))) rows-update (remove-cand rows x) cols-update (remove-cand cols y) blks-update (remove-cand blks (blk-ix x y)) board-update (assoc-in board [x y] cand) ]] (solve-sudoku tofill-update rows-update cols-update blks-update board-update)))) ))) ([board] (let [tofill (board-tofill board) rows (board-rows board) cols (board-cols board) blks (board-blks board) ] (remove nil? (solve-sudoku tofill rows cols blks board)) ))) (solve-sudoku board)
测试结果:
([3 2 1 9 6 5 8 4 7]
[5 8 6 2 7 4 3 9 1]
[7 9 4 3 8 1 5 2 6]
[2 4 7 8 1 6 9 3 5]
[9 3 8 7 5 2 1 6 4]
[1 6 5 4 3 9 2 7 8]
[4 5 9 1 2 7 6 8 3]
[6 7 3 5 9 8 4 1 2]
[8 1 2 6 4 3 7 5 9])
数独链接:http://cn.sudokupuzzle.org/