2016-06-14 2 views
1

Итак, я решал проблему n-queens и писал это решение для возврата.Странная вещь при решении n-queens

def isSafe(row, col, board): 
    print board 
    for i in range(col): 
     if board[row][i] == 'Q': 
      print 'faled here' 
      return False 

    r_row = row-1 
    c_col = col-1 
    while r_row >= 0 and c_col >=0: 
     if board[c_row][c_col] == 'Q': 
      return False 
     c_row -=1 
     c_col -=1 

    row = row-1 
    col = col-1 
    while row < len(board) and col >=0: 
     if board[row][col] == 'Q': 
      return False 
     row+=1 
     col-=1 
    return True 


def solveNQueen(column, board): 
    if column == len(board[0]): 
     print board 
     return True 

    for each_row in range(len(board)): 
     print each_row,column 
     if isSafe(each_row,column,board): 
      print board,'before' 
      board[each_row][column] = 'Q' 
      print board,' after' 
      if solveNQueen(column+1,board): 
       return True 
      else: 
       board[each_row][column] = 0 
     print 'failed' 
    return False 

board = [[0]*5]*5 

print solveNQueen(0,board) 

Странная вещь линия 34, 35 и 36, где я писал:

print board,'before' 
    board[each_row][column] = 'Q' 
    print board,' after' 

Это утверждение меняет все индексы в том же столбце «Q» вместо того, чтобы изменить его в конкретной строке и индекс столбца.

С выхода:

[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]] before 
[['Q', 0, 0, 0, 0], ['Q', 0, 0, 0, 0], ['Q', 0, 0, 0, 0], ['Q', 0, 0, 0, 0], ['Q', 0, 0, 0, 0]] after 

Что происходит? Или я просто пьян?

ответ

2

Вопрос board = [[0]*5]*5. Это дает вам пять копий того же списка из пяти нулей.

Одно из возможных решений:

board = [x[:] for x in [[0] * 5] * 5] 
+0

Ах! Черт возьми! Не знал этого. Я думал, что это крутой трюк для создания массива с двумя размерами! Большое вам спасибо! Я потратил так много времени на это: \ – yask

+0

Это уже пропасть, которая уже укусила меня. :-) См. Edit для возможного исправления. – smarx

+0

Почему это так :(? – yask

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