[funds-cvs] r136 - trunk/funds/src/examples
abaine at common-lisp.net
abaine at common-lisp.net
Thu Aug 16 03:28:16 UTC 2007
Author: abaine
Date: Wed Aug 15 23:28:16 2007
New Revision: 136
Modified:
trunk/funds/src/examples/sudoku.lisp
Log:
Closer to working solver.
Modified: trunk/funds/src/examples/sudoku.lisp
==============================================================================
--- trunk/funds/src/examples/sudoku.lisp (original)
+++ trunk/funds/src/examples/sudoku.lisp Wed Aug 15 23:28:16 2007
@@ -104,7 +104,6 @@
(+ (start j order)
(mod index order))))
-
(defun start (x order)
(* order (floor x order)))
@@ -142,3 +141,70 @@
(+ (* order (mod box order))
(mod index order))
number)))
+
+(defun solve (puzzle)
+ (cond ((complete-p puzzle) puzzle)
+ ((not (solvable-p puzzle)) nil)
+ (t (multiple-value-bind (x y z) (most-constrained-coordinates puzzle)
+ (or (solve (set-to-true puzzle x y z))
+ (solve (set-to-false puzzle x y z)))))))
+
+(defun most-constrained-coordinates (puzzle)
+ (let* ((best-i -1)
+ (best-j -1)
+ (best-k -1)
+ (size (puzzle-size puzzle))
+ (best-n (1+ size)))
+ (loop for i below size do
+ when
+ finally (return (values best-i best-j best-k)))))
+
+
+
+(defun solve-row (puzzle j k)
+ (let ((size (puzzle-size puzzle)))
+ (labels ((f (puzzle i)
+ (cond ((= i size) nil)
+ ((solved-p (puzzle-elt puzzle i j k) (f puzzle (1+ i))))
+ (t (or (solve (set-to-true puzzle i j k))
+ (f (set-to-false puzzle i j k) (1+ i)))))))
+ (f puzzle 0))))
+
+(defun solve-column (puzzle i k)
+ (let ((size (puzzle-size puzzle)))
+ (labels ((f (puzzle j)
+ (cond ((= j size) nil)
+ ((solved-p (puzzle-elt puzzle i j k)) (f puzzle (1+ j)))
+ (t (or (solve (set-to-true puzzle i j k))
+ (f (set-to-false puzzle i j k) (1+ j)))))))
+ (f puzzle 0))))
+
+(defun solve-number (puzzle i j)
+ (let ((size (puzzle-size puzzle)))
+ (labels ((f (puzzle k)
+ (cond ((= k size) nil)
+ ((solved-p (puzzle-elt puzzle i j k)) (f puzzle (1+ k))
+ (t (or (solve (set-to-true puzzle i j k))
+ (f (set-to-false puzzle i j k) (1+ k))))))))
+ (f puzzle 0))))
+
+(defun solve-box (puzzle box number)
+ (let ((size (puzzle-size puzzle)))
+ (labels ((f (puzzle index)
+ (cond ((= index size)nil)
+ ((solved-p (puzzle-elt-by-box puzzle box number index)
+ (f (puzzle 1+ index)))
+ (t (or solve )))))
+))))
+
+
+
+
+(defun i-j-k-coordinates (i j k)
+ (values i j k))
+
+(defun j-k-i-coordinates (j k i)
+ (values i j k))
+
+(defun k-i-j-coordinates (k i j)
+ (values i j k))
\ No newline at end of file
More information about the Funds-cvs
mailing list