最近我获得了一个编程任务,模仿了8个皇后问题,我确信你们都知道这个问题,并且负责为电路板上的不同部分创建功能。例如,将女王放在棋盘上,使她不会看到其他女王。
下面你会找到我的第一个功能queensees
,它基本上只是突出了女王在棋盘上的位置,并确定她是否可以看到其他人。
def queenSees(pos,size):
""" Return a list of all squares"In view" of a queen in position pos on a board of size"""
inView=[]
#Row and column
for i in range(size):
#Column
setAppend(inView,(i,pos[1]))
#Row
setAppend(inView,(pos[0],i))
#Diagonals
for r in [-1,1]:
for c in [-1,1]:
appendIfInBounds(inView, pointShift(pos,r*i,c*i), size)
#Take out position of queen so she doesn't see herself...
inView.remove(pos)
下面我还为车作品编写了一个函数,因为它只是将对角搜索从等式中解出来。
def rooksees(pos,size):
""" Return a list of all squares"In view" of a rook in position pos on a board of size"""
inView=[]
#Row and column
for i in range(size):
#Column
setAppend(inView,(i,pos[1]))
#Row
setAppend(inView,(pos[0],i))
appendIfInBounds(inView, pointShift(pos,r*i,c*i), size)
#Take out position of queen so he doesn't see himself...
inView.remove(pos)
我如何修改它以容纳骑士棋子?
答案 0 :(得分:0)
骑士在基本方向上移动两个距离中的一个,并且在正交方向上移动这两个距离中的另一个。 4个原始方向* 2个正交方向每个* 2个原始距离= 16个可能的位置。看起来你已经知道如何过滤掉实际上离开的理论位置,所以你需要做的就是首先产生这16个位置。如果你无法找到一种方法来提出这些programaticaly,你可以像这样硬编码:
positions = [[pos[0]+2,pos[1]+1],[pos[0]+2,pos[1]-1] ... ]
但这很容易产生轻微的错别字导致难以追踪的错误。更好的方法可能是硬编码"调整":
moves = [(2,1),(2,-1),(-2,1)(-2,-1) ... ]
然后使用循环将它们应用到当前位置:
positions = [[pos[0]+d[0],pos[1]+d[1]] for d in moves]
答案 1 :(得分:0)
你需要做的就是对角线代码的注释。
即使我知道坐标,我也无法实现骑士的看法:任何人都可以告诉我如何更改queensees功能以显示骑士 - 记得我已经注释掉了queensees功能元素我试图显示骑士的动作没有用。
def makeBoard(size): 板= [] 我的范围(大小): board.append([]) 对于范围(大小)中的j: 板[-1] .append(假) 返回董事会
def displayBoard(b): 分频器=( “+ ---” * LEN(B))+ “+” 对于b中的行: 打印分隔符 print“|”+“|”。join({True:“X”,False:“”} [i] for i in row)+“|” 打印分隔符
def setAppend(s,i): “”除非我已经在s“”“ 如果不是我在s:s.append(i)
def inBoard(p,size): msgstr“”“如果点对于给定大小的板有效,则返回True。否则返回False”“” 如果0 <= p [0]
def pointShift(p,r,c): “”返回单元格r,c的位置,远离给定点p“”“ return(p [0] + r,p [1] + c)
def appendIfInBounds(s,p,size): msgstr“”“如果点p在给定大小的板的范围内,则附加到s,除非它已经存在”“” 如果是inBoard(p,size): setAppend(S,P)
def queenSees(pos,size): “”返回所有正方形的列表“在视图中”在一块大小的板上位置pos的女王“”“ inView = [] moves = [(-2,-1),(-2,+ 1),(+ 2,-1),(+ 2,+ 1),( - 1,-2),( - 1,+ 2) ,(+ 1,-2),(+ 1,+ 2)] #Row和专栏 对于我的范围(大小):
setAppend(inview,(moves[i]))
#Column
#setAppend(inView,(i,pos[1]))
#Row
#setAppend(inView,(pos[0],i))
#Diagonals
#for r in [-1,1]:
#for c in [-1,1]:
# appendIfInBounds(inView, pointShift(pos,r*i,c*i), size)
#Take out position of queen so she doesn't see herself...
inView.remove(pos)
return inView
def hasQueen(董事会,积分): “”如果给定电路板上的任何给定点包含一个女王,则返回True“”“ 对于p点: 如果董事会[p [0]] [p [1]]: 返回True 返回False
def cloneBoard(b,size): msgstr“”“复制一块电路板。电路板是对象(列表是对象)所以a = b只是让它们引用同一个对象......”“ c = makeBoard(size)#clone 我的范围(大小): 对于范围(大小)中的j: C [i] [j] = B [i] [j] 返回c
def fillBoardRecursion(board,row,size): “”如果董事会已完成给定行,请尝试下一行的所有可能仓位并继续“”“ 如果row == size: #基本情况 返回董事会 其他: col范围(大小): #如果我们把女王放在这里,它会“看到”另一个吗? 如果没有hasQueen(board,queenSees((row,col),size)): B = cloneBoard(板,大小) B [行] [山口] = TRUE result = fillBoardRecursion(b,row + 1,size) 如果结果!=错误: 返回结果 返回False #Failed此时返回,所以返回False
B = makeBoard(8) B = fillBoardRecursion(B,0,8) displayBoard(b)中