你如何只打印第一个回溯解决方案?

时间:2015-09-30 07:55:11

标签: common-lisp backtracking

我正在使用Lisp中的回溯来处理N-queens问题。到目前为止,我的代码打印了n> = 4的所有可能解决方案。但是,我希望只打印任何n值的第一个解决方案。

(defun backtracksearch (row n)
// (if () *I probably need a line here to stop once the first solution is found*
(if (< row n)
  (loop for j below n
      do (when (is-safe row j n)
              (setf (aref *chessboard* row j) 'board)
              (backtracksearch (+ 1 row) n)
              (setf (aref *chessboard* row j) 'nil)))
(print-solution n)))

我尝试使用与回溯n-queens的C ++解决方案相同的实现/逻辑。 关于可能的前进方向的任何建议都会有所帮助。

1 个答案:

答案 0 :(得分:3)

您的代码的一些反馈:

  • 格式错误,缩进如下:

    (defun backtracksearch (row n)
      (if (< row n)
          (loop for j below n
                do (when (is-safe row j n)
                     (setf (aref *chessboard* row j) 'board)
                     (backtracksearch (+ 1 row) n)
                     (setf (aref *chessboard* row j) 'nil)))
          (print-solution n)))
    
  • //中的评论,请改用;

  • (dotimes (j n) (when ...))就足够了。

有些问题可以帮助您找到解决方案:

  • 当没有j满足is-safe时会发生什么?
  • 特别是backstracksearch的返回值是什么?
  • 找到解决方案后的返回值是多少?
  • 如何确定对backtracksearch的递归调用是否找到了解决方案?
  • 您是否可以使用此信息来避免计算其他解决方案?