专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > Perl/Python

python关于八皇后有关问题,有点疑问

发布时间:2011-06-29 20:10:12 文章来源:www.iduyao.cn 采编人员:星星草
python关于八皇后问题,有点疑问
这是《Python基础教程》上的八皇后代码:
Python code
def conflict(state, nextX):
    nextY = len(state)
    for i in range(nextY):
        if abs(state[i]-nextX) in (0, nextY-i):
            return True
        return False
    
def queens(num=8, state=()):
    for pos in range(num):
        if not conflict(state, pos):
            if len(state) == num-1:
                yield (pos,)
            else:
                for result in queens(num, state + (pos,)):
                    yield (pos,)+result

1.他的conflict函数的第二个参数是一个行的坐标,即x,然后遍历所有的列,判断是否有解,若有,返回True。
但是在queens函数中,为何要的pos要遍历0~range(num),这样给我的感觉就是遍历所有的列,而在conflict判断冲突的函数中,它又把pos当做x来做。
但是我觉得应该是pos来判断0~range(len(state)),即查看前面各行是否有冲突,若没有,则yield nextY这个值


2.书上说list(queens(4))返回的是两组解。
而我返回的都是无效解,代码和书上一摸一样的,我返回:
Python code

for line in list(queens(4)):
    print line
(0, 2, 1, 1)
(0, 2, 1, 2)
(0, 2, 3, 1)
(0, 2, 3, 2)
(0, 3, 1, 1)
(0, 3, 1, 2)
(0, 3, 3, 1)
(0, 3, 3, 2)
(1, 3, 0, 0)
(1, 3, 0, 2)
(1, 3, 0, 3)
(1, 3, 2, 0)
(1, 3, 2, 2)
(1, 3, 2, 3)
(2, 0, 1, 0)
(2, 0, 1, 1)
(2, 0, 1, 3)
(2, 0, 3, 0)
(2, 0, 3, 1)
(2, 0, 3, 3)
(3, 0, 0, 1)
(3, 0, 0, 2)
(3, 0, 2, 1)
(3, 0, 2, 2)
(3, 1, 0, 1)
(3, 1, 0, 2)
(3, 1, 2, 1)
(3, 1, 2, 2)



3.在书上最后用了这个代码:
Python code
import random
prettyprint(random.choice(list(queens(8))))

这样确实生成的解是有效的,这时我很纳闷了,他这里就是从list生成的解中随机抽取一个,但是为何我生成的都是无效解,但是random抽取一个又是对的呢?

------解决方案--------------------
第6行缩进的问题
Python code

def conflict(state, nextX):
    nextY = len(state)
    for i in range(nextY):
        if abs(state[i]-nextX) in (0, nextY-i):
            return True
    return False
    
def queens(num=8, state=()):
    for pos in range(num):
        if not conflict(state, pos):
            if len(state) == num-1:
                yield (pos,)
            else:
                for result in queens(num, state + (pos,)):
                    yield (pos,)+result

------解决方案--------------------
如果你对代码不解,把代码改成你认为可以的方式运行跟踪遍看看。这是解惑的正确方式,也是唯一你让你真正否定自己看法的方式。
------解决方案--------------------
建议:先用4皇后推演一遍,我觉得书上已经讲的够清楚了。
代码不应该是有问题的,如楼上所说,conflict的缩进有问题。
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

热门推荐: