philcode101
philcode101

Reputation: 35

Problems finishing off recursion with N_Queens

I'm doing the N_Queens problem and think I have got myself a bit lost within my code using recursion & backtracking.

I'm attempting to solve this without using any import functions, or advanced language. I've reached a point where i'm really frustrated and would appreciate any solution and comments on the side to help my knowledge.

        global N 
N = 8

board =      [[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,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,0,0,0,0,0,0],
              [0,0,0,0,0,0,0,0]]

def printboard(board): 
    for row in range(N): 
        for col in range(N): 
            print(board[row][col], end=' ') 
        print('')



def SafePosition(board, row, col): 

  return (board[row][col]==0)

  def AddQueen(board, row, col):
    K = row+col
    L = row-col
    for row in range(N): 
        for col in range(N): 
          if (row+col == K) or (row==row) or (col==col) or (row-col == L):
            board[row][col] = 1       
    board[row][col] = 2

def findCol(board, col):
  for row in range(N):
    if(board[col][row] == 0):
      return [row]




def SolveNQueens(): 
  findCol(board, col)
  if board[row][col] == 0:
    AddQueen(board,row,col)
    if SafePosition(board,row, col):
      board[row][col]= 2
      SolveNQueens()
      board[row][col] = 0
    return



  printboard(board)

SolveNQueens()

It firstly says 'Col' is not defined which is confusing me, I secondly seem unable to advance from this current situation.

Ideally, the board should place a 2 at every point the Queen is placed.

Please go easy on me, I have only just started learning Python3.

Upvotes: 0

Views: 45

Answers (1)

SolveNQueens() gets called first when the code runs, and the first statement is findCol(board, col), until this point we only have defined globals N and board but there is no definition of col.
However, row and col are defined in other functions, so maybe we can also put those definitions in SolveNQueens() function to clear that error, something like:

def SolveNQueens():
    columns = [col for col in range(N)] # using previous definitions from 
    rows = [row for row in range(N)]    # printboard(board) function

    # can use one range here because board is a square
    # with same length sides columns and rows
    # either len(rows), or len(columns)

    for i in range(len(rows)):
        row = rows[i]   
        col = columns[i]

        # now we have row, col available
        findCol(board, col)
        ...

Upvotes: 1

Related Questions