1D N Queens Array (Python) Функция решения - PullRequest
0 голосов
/ 20 января 2019

Я знаю, что N_Queens - очень хорошо освещенная тема, но мне нужно найти хорошее решение на python, которое использует одномерный массив (и, что важно, решает путем заполнения 1d-массива, а затем через функцию преобразует его в 2d-массив).

Я дошел до завершения (что я считаю слишком сложной) функции печати и проверки, но мне кажется, что я не могу выполнить функцию решения.

global queens
queens = []

def printQ():
    for i in queens:
        for row in range(8):
            if row == i:
                print(" Q",end="")
            else:
                print(" .",end="")
        print(" ")

def solve(x):
    step = len(queens) 
    for indices in range(step):
        if (x == queens[indices]):
            return False
    for i in range(step,0,-1):    
        if (x == queens[0-i]-i) or (x == queens[0-i]+i):
            return False       
    else:
        return True


def complete():
    for i in range(8):
        if solve(i) == True:
            queens += [i]
        elif solve(i) == False:
            queens = queens - [i]
        else:
            return

Я пытаюсь перебрать список и поместить элементы в глобальные [queens], если это возможно. Каждый раз, когда я пытаюсь изменить complete (), я получаю пустой список или ошибку. Я пытаюсь решить эту проблему с помощью обратного отслеживания, но я не уверен, как именно мой псевдо-код должен выглядеть для complete ()

Буду очень признателен за любые советы, и извиняюсь, если мой код не качественный, очень начинающий.

примечание: чтобы доказать, что обе функции работают, просто добавьте элементы в массив [1,4,2], например.

1 Ответ

0 голосов
/ 20 января 2019

Если вы изменяете глобальную переменную из функции, вам нужно пометить ее как глобальную, в противном случае функция будет обрабатывать эту переменную как локальную.Это то, что вы получаете.Вы получаете пустой список queens в вашей функции complete.Обратите внимание, что вы можете ссылаться на глобальные (как вы делаете это в printQ и solve функциях, но если вы собираетесь изменить его (как у вас в complete функции), вы должны пометить его как global. Здесьпример того, как это сделать. Также вам не нужно помечать его как глобальный на уровне модуля (первая строка в вашем коде), он должен быть на уровне функции

def complete():
    global queens
    for i in range(8):
        if solve(i) == True:
            queens += [i]
        elif solve(i) == False:
            queens = queens - [i]
        else:
            return
...