python中的n queens程序不起作用

时间:2013-12-21 17:46:24

标签: python function recursion python-3.x n-queens

我在n皇后的python中遇到了我的程序问题(有多少种可能的方法可以将n个皇后放在nxn板上)。好像我的递归有问题,但我真的很无奈。有人能弄明白什么是错的吗?

def queens(N):

    ''' how many ways to place n queens on an NXN board? '''

    partial = []    # list representing partial placement of queens on the left columns
    return queens_rec(N,partial)

def queens_rec(N, partial):
    '''Given a partial solution to the n-Queens Problem ,
        return the number of options to place the rest of the queens.
        Recursively, in the end we will get the number of the options for
        the whole NxN board'''

    if len(partial)==N:
        return 1

    total = 0 #total of full solutions found
    row = 0

    while row<N:
        if isUnderAttack(partial,N,row)==False: #means it is not under Attack
            partial+=[row]

            total=total+queens_rec(N, partial)

            row+=1
            current = len(partial)

            partial = partial[0:current-1]

        else:
            row+=1

    return total

def isUnderAttack(partial, N, newRow):
    '''Checking if we can add a queen in row newRow, to the next column'''

    newCol = len(partial)

    for col in range(newCol): #not inculding newCol, checking all the previous columns
        oldRow = partial[col]


        #Checking horizontal attack from existing queen:
        if (newRow == oldRow):

            return True

        if (newCol - col == newRow - oldRow):

            return True

        if (newCol - col == oldRow - newRow):

            return True        

    return False

1 个答案:

答案 0 :(得分:0)

您写道:

            partial+=[row]
            ...
            partial = partial[0:current-1]

第一个命令将列表部分修改到位。第二个制作副本并保持原始数组不变。

你应该写:

partial.append(row) # this is equivalent to:  partial += [row]
...
partial.pop() # modifes list in place