我绝对对这个python编程练习感到困惑,有人可以告诉我哪里出了问题吗?

时间:2018-08-13 13:48:22

标签: python algorithm graph-algorithm n-queens

我当前正在做一个python练习,当给定大小为n的国际象棋棋盘时,我将返回一个具有最大皇后数量的解决方案,这样就不会有两个皇后互相攻击。 因此,一种解决方案要求没有两个皇后共享相同的行,列或对角线。

我目前能够生成木板,但问题出在我的代码的第20行,即if bd not in soln。由于某种原因,我无法识别该行代码,因此无法正确执行,并将正确的电路板正确地附加到我的解决方案集中。

如果有人可以帮助您确定问题,我将非常感激。

import random

def queensol(n):
    """Find the number of solutions to placing Queens on a chessboard of size n"""
    size = n
    rng = random.Random()
    tries = 0
    bd = list(range(size))
    soln = []

    while True:
        tries += 1
        rng.shuffle(bd)
        correct = 0
        for queen_index in range(size):
            if queen_noclash(bd, queen_index):
                correct += 1
        board_valid = correct == size
        if board_valid:
            if bd not in soln:
                soln.append(bd)
                print(soln)

def no_diagonal(x1, y1, x2, y2):
    dx = abs(x1-x2)
    dy = abs(y1-y2)
    # print('dx',dx)
    # print('dy',dy)
    if dx == dy:
        return False
    else:
        return True


def queen_noclash(bd, queen):
    correct = 0
    for left_queen in range(queen):
        left_queen_x = left_queen
        left_queen_y = bd[left_queen]
        queen_x = queen
        queen_y = bd[queen]
        if no_diagonal(left_queen_x, left_queen_y, queen_x, queen_y):
            correct += 1
    if correct == queen:
        return True
    else:
        return False


queensol(4)

1 个答案:

答案 0 :(得分:0)

问题在于bd是一个对象。您要将同一对象附加到板上。因此,即使bd更改train = df.loc[~df['x'].isin(['a','b'])] test = df.loc[df['x'].isin(['a','b'])] 始终会为False,因为您正在比较同一对象。每次追加到soln数组时,都应使用list(bd)创建一个新对象。我已经在下面的代码中解决了这个问题。

bd not in soln