diff --git a/sudoku-algorithm.lisp b/sudoku-algorithm.lisp index 95ee0addcff65671bf0ee2314dd5cd4dcf8110d7..a99df725ce5098373d26cea593a4f03c3b0dbbb3 100644 --- a/sudoku-algorithm.lisp +++ b/sudoku-algorithm.lisp @@ -52,6 +52,10 @@ (setf (aref tmp order-1) 0))))) (setf (possibilities cell) tmp))) +;;; We either need to change the name of the `game' class to `board', +;;; or change the comment to say that it represents a Sudoku `game'. +;;; RS 2010-04-19 + ;;; This class represents a Sudoku board. ;;; It includes an array of symbols that is used to display characters, ;;; an array of cells in the board, @@ -184,7 +188,8 @@ (return-from create-initial-board board))) ;;; Exchange two non-overlapping rectangles having the same shape -(defun exchange-rectangles (board +;;; in a 2-dimensional array. +(defun exchange-rectangles (array start-row-1 start-col-1 height width start-row-2 start-col-2) @@ -195,26 +200,35 @@ do (loop for col-1 from start-col-1 for col-2 from start-col-2 repeat width - do (rotatef (aref board row-1 col-1) - (aref board row-2 col-2)))))) - -(defun exchange-rows (board row-1 row-2) - (let ((board-width (array-dimension board 0))) - (exchange-rectangles board row-1 0 1 board-width row-2 0))) - -(defun exchange-columns (board col-1 col-2) - (let ((board-height (array-dimension board 1))) - (exchange-rectangles board 0 col-1 board-height 1 0 col-2))) - -(defun exchange-blocks-of-rows (board row-1 row-2) - (let* ((board-width (array-dimension board 0)) - (sqrt-board-width (isqrt board-width))) - (exchange-rectangles board row-1 0 sqrt-board-width board-width row-2 0))) - -(defun exchange-blocks-of-columns (board col-1 col-2) - (let* ((board-width (array-dimension board 0)) - (sqrt-board-width (isqrt board-width))) - (exchange-rectangles board 0 col-1 board-width sqrt-board-width 0 col-2))) + do (rotatef (aref array row-1 col-1) + (aref array row-2 col-2)))))) + +;;; Exchange two rows in a 2-dimensional array. +(defun exchange-rows (array row-1 row-2) + (let ((width (array-dimension array 0))) + (exchange-rectangles array row-1 0 1 width row-2 0))) + +;;; Exchange two columns in a 2-dimensional array. +(defun exchange-columns (array col-1 col-2) + (let ((height (array-dimension array 1))) + (exchange-rectangles array 0 col-1 height 1 0 col-2))) + +;;; This function is more limited than the previous ones. +;;; It exchanges two block of rows, where each block has +;;; a height which is the square root of the hight of +;;; the array. +(defun exchange-blocks-of-rows (array row-1 row-2) + (let* ((width (array-dimension array 1)) + (sqrt-height (isqrt (array-dimension array 0)))) + (exchange-rectangles array row-1 0 sqrt-height width row-2 0))) + +;;; This function exchanges two blocks of columns, where +;;; each block has width which is the square root of the +;;; width of the array +(defun exchange-blocks-of-columns (array col-1 col-2) + (let* ((height (array-dimension array 0)) + (sqrt-width (isqrt (array-dimension array 1)))) + (exchange-rectangles array 0 col-1 height sqrt-width 0 col-2))) ;;; This function computes a random permutation of n elements. It ;;; works as follows: At each iteration, there is a prefix of i random