python - N Queens Breadth First Search -
i trying find solution n queens problem using breadth first search.
now, solution written n-rocks, cannot adjust work n queens puzzle. understand trying searching diagonal correct?
i tried following https://rosettacode.org/wiki/n-queens_problem#python:_raymond_hettingers_permutations_based_solution , adapt is_goal_queens
, without success.
i need find 1 solution, not of them, first 1 gets hit bfs need.
and need adjust disallow field (x,y) initial board. assume queue starts particular row/column set?
import sys import time f = str(sys.argv[1]) # size of board n = int(sys.argv[2]) # row x = int(sys.argv[3]) # col y = int(sys.argv[4]) print f, n, x, y initial_board = [[0] * n] * n def q_count_on_row(board, row): return len(board[row]) # count # of pieces in given column def q_count_on_col(board, col): return len([row[col] row in board]) def q_count_pieces(board): return len([len(row) row in board]) # return string board rendered in human-friendly format def printable_board_queens(board): return "\n".join([" ".join(["q" if col else "." col in row]) row in board]) # add piece board @ given position, , return new board (doesn't change original) def add_piece(board, row, col): return board[0:row] + [board[row][0:col] + [1, ] + board[row][col+1:]] + board[row+1:] # list of successors of given board state def successors2(board): return [add_piece(board, r, c) r in range(0, n) c in range(0, n) if count_pieces(board)+1 <= n] # check if board goal state def is_goal_queens(board): return q_count_pieces(board) == n , \ all([q_count_on_row(board, r) != r-1 r in range(0, n)]) , \ all([q_count_on_col(board, c) != c-1 c in range(0, n)]) def solve_queens(initial_board): fringe = [initial_board] while len(fringe) > 0: s in successors2(fringe.pop(0)): print s if is_goal_queens(s): return s fringe.append(s) return false def main(): if f == 'nqueens': print ("starting initial board:\n" + printable_board_queens(initial_board) + "\n\nlooking solution...\n") solution = solve_queens(initial_board) print (printable_board_queens(solution) if solution else "sorry, no solution found. :(") else: print "not valid argument" if __name__ == '__main__': start_time = time.time() main() print time.time() - start_time
edit:
i have changed is_goal_queens()
, result outputted is:
starting initial board: . . . . . . . . . . . . . . . . looking solution... [[1, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]] q . . . . . . . . . . . . . . . 0.0
Comments
Post a Comment