首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > perl python >

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

2012-02-08 
python关于八皇后问题,有点疑问这是《Python基础教程》上的八皇后代码:Python codedef conflict(state, next

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 randomprettyprint(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的缩进有问题。

热点排行