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

测试昵称666 2011-12-13 09:22:13
这是《Python基础教程》上的八皇后代码:
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))返回的是两组解。
而我返回的都是无效解,代码和书上一摸一样的,我返回:

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.在书上最后用了这个代码:
import random
prettyprint(random.choice(list(queens(8))))

这样确实生成的解是有效的,这时我很纳闷了,他这里就是从list生成的解中随机抽取一个,但是为何我生成的都是无效解,但是random抽取一个又是对的呢?
...全文
283 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
测试昵称666 2011-12-13
  • 打赏
  • 举报
回复
谢谢LS各位,我把nextX和nextY的方向搞错了,他这里的nextX是列值,也就是x坐标,和我们平常看的二位数组中,用x代表行值不一样~~~
poefshen 2011-12-13
  • 打赏
  • 举报
回复
建议:先用4皇后推演一遍,我觉得书上已经讲的够清楚了。
代码不应该是有问题的,如楼上所说,conflict的缩进有问题。
测试昵称666 2011-12-13
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 iambic 的回复:]

如果你对代码不解,把代码改成你认为可以的方式运行跟踪遍看看。这是解惑的正确方式,也是唯一你让你真正否定自己看法的方式。
[/Quote]

不是不解,只是这个分析过,感觉和我以前用其他语言写的八皇后,有点出入,问题肯定是出在我自己身上,只是那里有些想不明白。
测试昵称666 2011-12-13
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 duojiawang 的回复:]

第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……
[/Quote]

汗。。。非常感谢你,兄弟,我刚才也测试了,random那个也是我的问题。

那请教下,问题1中那个conflict的第二个参数的问题,能否帮忙看看
iambic 2011-12-13
  • 打赏
  • 举报
回复
如果你对代码不解,把代码改成你认为可以的方式运行跟踪遍看看。这是解惑的正确方式,也是唯一你让你真正否定自己看法的方式。
多加旺 2011-12-13
  • 打赏
  • 举报
回复
第6行缩进的问题

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

37,743

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • WuKongSecurity@BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧