python中八皇后如何运算的_Python学习总结:python基础(第2版)八皇后代码理解与总结...

由元组表示皇后的位置。每个元组中元素指示相应行的皇后的位置(也就是列)。例如:如果state[0] == 3,就表示,第一个皇后位于棋盘的第1行的第4列。state中存储的是皇后的“列”位置信息。如:state=(1,3,0),即:state[0]=1,state[1]=3,state[2]=0,第1个皇后位于1行2列,第2个皇后位于2行4列,第3个皇后位于3行1列,也就是说,state存储的是皇后的 “列”信息,“索引参数”是行信息。

先附上实现八皇后的代码,下来分部来理解学习。

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

def prettyprint(solution):

def line(pos,length = len(solution)):

return '. '*pos + '* ' + '. '*(length - pos - 1)

for pos in solution:

print(line(pos))

调用:

import random

prettyprint(random.choice(list(queens(8))))

二、判断下一个的皇后的位置会不会有冲突

#1.conflict(state,nextX)

#有冲突:Ture,无冲突:False

def conflict(state,nextX):

nextY = len(state)

for i in range(nextY):

if abs(state[i]-nextX) in (0,nextY-i):

return True

return Fals

什么是冲突?

新的皇后与之前的皇后 同列,同行,同对角线为冲突信息。从冲突想办法转换为数学关系式:

根据我自身学习遇到的困难,为了更好的理解代码,现用4皇后来说明上述代码。

conflict函数中理解:

if abs(state[i]-nextX) in (0,nextY-i):

是关键,首先明确state[i],nextX,nextY,i的含义。为了更好的说明,结合下面的代码(已知前n-1皇后的位置,如何确定最一个(第n个)皇后的位置):

def queens(num,state):

if len(state) == num-1:

for pos in range(num):

if not conflict(state,pos):

yield pos

以4皇后问题来说明 if abs(state[i]-nextX) in (0,nextY-i): 代码,如图:

                      

前3个皇后位置已经确定,“列”信息以元组的形式(1,3,0)存储。获得第4个皇后位置调用语句:

list(queens(4,(1,3,0)))

yield pos,返回的是列的值,输出[ 2 ],3行(前3个皇后已经确定,现在是确定最后一个皇后的位置)2列

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值