以下是国际象棋桌上贪婪皇后的代码,我不明白它是如何运作的:
//在这里创建表
def create_table(m,n):
t=[]
one_line=[]
for i in range(0,m):
one_line.append(0)
for i in range(0,n):
t.append(one_line)
return t
//在这里我迷失了这个循环。成本的目的是什么以及如何轻松理解这里的内容?
def getPositionCost(t,pi,pj):
n=len(t)
m=len(t[0])
cost=0
for i in range(0,len(t)):
for j in range(0,len(t[i])):
if pi==i and t[i][j]==0:
cost=cost+1
if pj==j and t[i][j]==0:
cost=cost+1
i=pi
j=pj
while i>0 and j>0:
i=i-1
j=j-1
if t[i][j]==0:
cost=cost+1
i=pi
j=pj
while i<n-1 and j<m-1:
i=i+1
j=j+1
if t[i][j]==0:
cost=cost+1
i=pi
j=pj
while i>0 and j<m-1:
i=i-1
j=j+1
if t[i][j]==0:
cost=cost+1
i=pi
j=pj
while i<n-1 and j>0:
i=i+1
j=j-1
if t[i][j]==0:
cost=cost+1
return cost-1
//这里把女王放在桌子里。但是在哪个标准?
def putOnPosition(t,pi,pj):
n=len(t)
m=len(t[0])
for i in range(0,len(t)):
for j in range(0,len(t[i])):
if pi==i and t[i][j]==0:
t[i][j]=1
if pj==j and t[i][j]==0:
t[i][j]=1
i=pi
j=pj
while i>0 and j>0:
i=i-1
j=j-1
if t[i][j]==0:
t[i][j]=1
i=pi
j=pj
while i<n-1 and j<m-1:
i=i+1
j=j+1
if t[i][j]==0:
t[i][j]=1
i=pi
j=pj
while i>0 and j<m-1:
i=i-1
j=j+1
if t[i][j]==0:
t[i][j]=1
i=pi
j=pj
while i<n-1 and j>0:
i=i+1
j=j-1
if t[i][j]==0:
t[i][j]=1
t[pi][pj]="X"
return
def getMinCostPosition(t):
min=-1
pi=-1
pj=-1
for i in range (0,len(t)):
for j in range(0,len(t[i])):
if t[i][j]==0:
cost=getPositionCost(t, i, j)
if min==-1:
min=cost
pi=i
pj=j
elif cost<min:
min=cost
pi=i
pj=j
return pi,pj,min
def gbfs(m,n):
queens=0
table = [[0 for x in range(n)] for x in range(m)]
#table=create_table(4,5)
for line in table:
print(line)
i,j,mi=getMinCostPosition(table)
while i!=-1:
i,j,mi=getMinCostPosition(table)
putOnPosition(table, i, j)
i,j,mi=getMinCostPosition(table)
for line in table:
print(line)
for i in range(0,len(table)):
if "X" in table[i]:
queens=queens+1
print("Maximum number of queens :"+ str(queens))
return queens
我想了解代码背后的逻辑,我试图在纸上采取每一步,但我已经失去了它。我不明白女王被放在桌子上的标准是什么?什么成本意味着什么? 如果我给出3x3表,则输出为:
['X', 1, 1]
[1, 1, 'X']
[1, 1, 1]
没关系,但如果我给4x4:
['X', 1, 1, 1]
[1, 1, 1, 'X']
[1, 'X', 1, 1]
[1, 1, 1, 1]
为什么女王没有被列入第二栏第三栏?