n-queen贪婪算法python

时间:2016-04-24 14:21:47

标签: python greedy

以下是国际象棋桌上贪婪皇后的代码,我不明白它是如何运作的:

//在这里创建表

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]

为什么女王没有被列入第二栏第三栏?

0 个答案:

没有答案