【问题标题】:How do you print only the first solution of backtracking?你如何只打印回溯的第一个解决方案?
【发布时间】:2015-09-30 07:55:10
【问题描述】:

我正在使用 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++ 解决方案中相同的实现/逻辑。 任何关于可能的前进方向的建议都会有所帮助。

【问题讨论】:

  • 为什么标记为c++?将其标记为lisp
  • “回溯 n-queens 的 C++ 解决方案”只有你知道。如果您想告诉我们,请提供参考;否则就别提了。

标签: common-lisp backtracking


【解决方案1】:

对您的代码的一些反馈:

  • 格式错误,缩进如下:

    (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)))
    
  • // 中的 cmets,请改用 ;

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

帮助您找到解决方案的一些问题:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-07
    • 2013-12-29
    • 2011-12-08
    • 1970-01-01
    • 2021-04-15
    • 2013-03-29
    相关资源
    最近更新 更多