Scheme中的数独回溯算法

时间:2014-05-25 15:31:41

标签: recursion scheme racket sudoku backtracking

我的sudoku-solver函数有问题,它没有进行回溯过程,我看不出原因,只是当回溯到来时,函数停止,这里是代码:

(define (solve-sudoku grid)
 (define blank-space (check-for-empty-space 0 '()))
 (cond [(empty? blank-space) (begin (display "FIN\n") true)])
 (define x (first blank-space))
 (define y (first (rest blank-space)))
 (display x) (display y) (display "\n")
 (cond [(eqv? #f (try-value grid 1 x y )) false])
)

(define (try-value grid num  x y )
  (cond [(> num 9) false]
       [(is-safe grid num x y) 
        (begin 
          (assign-to-pos grid num x y) 
           (cond [(solve-sudoku grid) true]
                 [else (begin (display "reset\n")  
                       (assign-to-pos grid 0 x y))]
               ))]
    [else (try-value grid (+ 1 num) x y)])
  )

我有一个测试矩阵:

; --------------- + ----- + ----- + ----- + -
(定义row0(向量3 0 6 5 0 8 4 0 0))
(定义row1(向量5 2 0 0 0 0 0 0 0))
(定义row2(向量0 8 7 0 0 0 0 3 1))
; --------------- + ----- + + ----- ----- + -
(定义row3(向量0 0 3 0 1 0 0 8 0))
(定义row4(向量9 0 0 8 6 3 0 0 5))
(定义row5(向量0 5 0 0 9 0 6 0 0))
; --------------- + ----- + + ----- ----- + -
(定义row6(向量1 3 0 0 0 0 2 5 0))
(定义row7(向量0 0 0 0 0 0 0 7 4))
(定义row8(向量0 0 5 2 0 6 3 0 0))
; --------------- + ----- + + ----- ----- + -
(定义网格(向量row0 row1 row2 row3 row4 row5 row6 row7 row8))

输出结果为:

空位:0,1
空位:0,4
空位:0,7
空位:0,8
空位:1,2
空位:1,3
空位:1,4
空位:1,5
空位:1,6
空位:1,7
空位:1,8
重置

  

结果
  '#(#1(3 1 6 5 2 8 4 9 7)
     #(5 2 4 1 3 7 8 0 0)
     #(0 8 7 0 0 0 0 3 1)
     #(0 0 3 0 1 0 0 8 0)
     #(9 0 0 8 6 3 0 0 5)
     #(0 5 0 0 9 0 6 0 0)
     #(1 3 0 0 0 0 2 5 0)
     #(0 0 0 0 0 0 0 7 4)
     #(0 0 5 2 0 6 3 0 0))

1 个答案:

答案 0 :(得分:1)

您的测试用例非常,我可以理解为什么要弄清楚出了什么问题真的很难。而不是试图调试整个巨大的东西,首先测试件。我无法看到您的所有程序,但听起来您需要为程序中的所有函数编写许多小测试。