首先,让我描述一下我是如何理解这个程序的工作原理的。因为如果我们对它应该如何工作有不同的想法,那么理解它的实现就很难了。
假设我们已经有了1-列和2-列问题的第一个解决方案:
First of 8 Solutions To the 1-Column Problem:
=============================================
_
|_|
|_|
|_|
|_|
|_|
|_|
|_|
|Q|
position: ((1 1))
First of 42 Solutions To the 2-Column Problem:
==============================================
_ _
|_|_|
|_|_|
|_|_|
|_|_|
|_|_|
|_|Q|
|_|_|
|Q|_|
position: ((2 3) (1 1))
对于3-Column问题,我们从2-Column问题的第一个解决方案开始,然后为皇后可以放置在第三列中的8个可能行生成8个可能的板位置:
First 8 Positions to Test as Possible Solutions To the 3-Column Problem:
========================================================================
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
|_|_|_ |_|_|_ |_|_|_ |_|_|_ |_|_|_ |_|_|_ |_|_|_ |_|_|?
|_|_|_ |_|_|_ |_|_|_ |_|_|_ |_|_|_ |_|_|_ |_|_|? |_|_|_
|_|_|_ |_|_|_ |_|_|_ |_|_|_ |_|_|_ |_|_|? |_|_|_ |_|_|_
|_|_|_ |_|_|_ |_|_|_ |_|_|_ |_|_|? |_|_|_ |_|_|_ |_|_|_
|_|_|_ |_|_|_ |_|_|_ |_|_|? |_|_|_ |_|_|_ |_|_|_ |_|_|_
|_|Q|_ |_|Q|_ |_|Q|? |_|Q|_ |_|Q|_ |_|Q|_ |_|Q|_ |_|Q|_
|_|_|_ |_|_|? |_|_|_ |_|_|_ |_|_|_ |_|_|_ |_|_|_ |_|_|_
|Q|_|? |Q|_|_ |Q|_|_ |Q|_|_ |Q|_|_ |Q|_|_ |Q|_|_ |Q|_|_
First 8 positions to test:
((3 1) (2 3) (1 1))
((3 2) (2 3) (1 1))
((3 3) (2 3) (1 1))
((3 4) (2 3) (1 1))
((3 5) (2 3) (1 1))
((3 6) (2 3) (1 1))
((3 7) (2 3) (1 1))
((3 8) (2 3) (1 1))
通过扩展2列解决方案,将邻接位置调用8次以创建要测试的位置。(一个可能的混淆原因是,邻接位置的前两个参数是row然后col,但传统上位置会col然后row)。
Creating the first 8 positions to test:
(adjoin-position 1 3 ((2 3) (1 1))) => ((3 1) (2 3) (1 1))
(adjoin-position 2 3 ((2 3) (1 1))) => ((3 2) (2 3) (1 1))
(adjoin-position 3 3 ((2 3) (1 1))) => ((3 3) (2 3) (1 1))
(adjoin-position 4 3 ((2 3) (1 1))) => ((3 4) (2 3) (1 1))
(adjoin-position 5 3 ((2 3) (1 1))) => ((3 5) (2 3) (1 1))
(adjoin-position 6 3 ((2 3) (1 1))) => ((3 6) (2 3) (1 1))
(adjoin-position 7 3 ((2 3) (1 1))) => ((3 7) (2 3) (1 1))
(adjoin-position 8 3 ((2 3) (1 1))) => ((3 8) (2 3) (1 1))
然后对这些进行过滤,给出扩展第一个2柱解决方案的3柱问题的四个解决方案。
First 4 (of 140) Solutions to the 3-Column problem:
===================================================
positions:
((3 5) (2 3) (1 1))
((3 6) (2 3) (1 1))
((3 7) (2 3) (1 1))
((3 8) (2 3) (1 1))
_ _ _ _ _ _ _ _ _ _ _ _
|_|_|_ |_|_|_ |_|_|_ |_|_|Q
|_|_|_ |_|_|_ |_|_|Q |_|_|_
|_|_|_ |_|_|Q |_|_|_ |_|_|_
|_|_|Q |_|_|_ |_|_|_ |_|_|_
|_|_|_ |_|_|_ |_|_|_ |_|_|_
|_|Q|_ |_|Q|_ |_|Q|_ |_|Q|_
|_|_|_ |_|_|_ |_|_|_ |_|_|_
|Q|_|_ |Q|_|_ |Q|_|_ |Q|_|_
正如你所看到的,我的邻接位置与你的完全不同,它需要一个列表列表,并返回一个更长的列表列表(板上皇后的坐标)。
我发现很难理解我自己的解决方案,目前我很难理解你的解决方案是如何运作的。如果我的描述中的图像/算法部分与你的解决方案相匹配,并且只是位置的表示/实现不同,那么如果你能描述一下你是如何表示这些位置的,这可能会很有用。例如,您希望看到什么,而不是:
(adjoin-position 1 3 ((2 3) (1 1))) => ((3 1) (2 3) (1 1))
(adjoin-position 2 3 ((2 3) (1 1))) => ((3 2) (2 3) (1 1))
(adjoin-position 3 3 ((2 3) (1 1))) => ((3 3) (2 3) (1 1))
...