2016-12-27 4 views
0

Я пробовал следующий код. Если есть какие-либо изменения, которые могут быть сделаны, это может быть сделано для уменьшения сложности кода. Я использовал вложенный словарь с именем board.Решение N-queens с использованием Python (альтернативы кодирования):

def initialize(board,n): 
    for key in ['queen','row','col','nwtose','swtone']: 
    board[key] = {} 
    for i in range(n): 
    board['queen'][i] = -1 
    board['row'][i] = 0 
    board['col'][i] = 0 
    for i in range(-(n-1),n): 
    board['nwtose'][i] = 0 
    for i in range(2*n-1): 
    board['swtone'][i] = 0 

def printboard(board): 
    for row in sorted(board['queen'].keys()): 
    print((row,board['queen'][row])) 

def free(i,j,board): 
    return(board['queen'][i] == 0 and board['row'][i] == 0 and board['col'][j] == 0 and board['nwtose'][j-i] == 0 and board['swtone'][j+i] == 0) 

def addqueen(i,j,board): 
    board['queen'][i] = j 
    board['row'][i] = 1 
    board['col'][j] = 1 
    board['nwtose'][j-i] = 1 
    board['swtone'][j+i] = 1 

def undoqueen(i,j,board): 
    board['queen'][i] = -1 
    board['row'][i] = 0 
    board['col'][j] = 0 
    board['nwtose'][j-i] = 0 
    board['swtone'][j+i] = 0 


def placequeen(i,board): 
    n = len(board['queen'].keys()) 
    for j in range(n): 
     if free(i,j,board): 
     addqueen(i,j,board) 
     if i == n-1: 
      return(True) 
     else : 
      extendsoln = placequeen(i+1,board) 
     if extendsoln: 
      return(True) 
     else: 
      undoqueen(i,j,board) 
    else: 
     return(False) 


board = {} 
n = int(input("How many Queens? ")) 
initialize(board,n) 
if placequeen(0,board): 
    printboard(board) 

Так что, когда я пробовал этот код, я могу дать ввод say 4, но не получить выход. Где я не ошибаюсь ???

Благодаря

+0

Добро пожаловать в переполнение стека. Похоже, вам нужно научиться использовать отладчик для последовательного шага по вашему коду, что, вероятно, позволит вам легко определить характер и местоположение проблемы, с которой вы сталкиваетесь. Использование отладчика для всех целей и целей требует знаний для любого программиста. Для получения дополнительной информации см. [Как отладить небольшие программы] (http://ericlippert.com/2014/03/05/how-to-debug-small-programs/). –

ответ

0

При инициализации платы в initialize() установить все значения board['queen'][i] к -1. Ваша основная программа вызывает if placequeen(0,board):, которая для каждого значения j звонит if free(i,j,board):, который проверяет board['queen'][i] == 0. Последняя проверка не удалась для всех j, поэтому free() возвращает False, а placequeen никогда не добавляет королеву, таким образом возвращает False, и ваша основная программа никогда не пытается распечатать плату.

Ваша программа сложнее, чем необходимо: я не вижу необходимости в вашем словаре, и вы можете просто использовать свои различные массивы в качестве отдельных переменных. Однако на самом деле вы не просили упростить свой код. Я не уверен, как вы можете удалить эту ошибку без печати, но подумайте о настройке board['queen'][i] на 0, а не на -1.

Я согласен с @RandomDavis, что вам нужно научиться использовать отладчик. Я использовал один, чтобы найти причину вашей заявленной ошибки, но другие могут остаться.

+0

Спасибо, сэр. Мне пришлось изменить функцию free (i, j, board). Я удалил плату ['queen'] [i] == 0, затем вывод был отображен на экране. Я выполнил стратегию отладки для этого кода, как сказал @RandomDavis. –

Смежные вопросы