#! /usr/bin/python3
import sys

def nqueens(board_width):
	board = [0]
	current_row = 0
	while True:
		conflict = False
		
		for review_index in range(0, current_row):
			left = board[review_index] - (current_row - review_index)
			right = board[review_index] + (current_row - review_index);
			if (board[current_row] == board[review_index] or (left >= 0 and left == board[current_row]) or (right < board_width and right == board[current_row])):
				conflict = True;
				break
	
		if (current_row == 0 and conflict == False):
			board.append(0)
			current_row = 1
			continue

		if (conflict == True):
			board[current_row] += 1
			
			if (current_row == 0 and board[current_row] == board_width):
				print("No solution exists for specificed board size.")
				return None
			
			while True:
				if (board[current_row] == board_width):
					board[current_row] = 0
					if (current_row == 0):
						print("No solution exists for specificed board size.")
						return None
					
					board.pop()
					current_row -= 1
					board[current_row] += 1
					
				if board[current_row] != board_width:
					break
		else:
			current_row += 1
			if (current_row == board_width):
				break

			board.append(0)
	return board

def print_board(board):
	if (board == None):
		return

	board_width = len(board)
	for row in range(board_width):
		line_print = []
		for column in range(board_width):
			if column == board[row]:
				line_print.append("Q")
			else:
				line_print.append(".")
		print(line_print)


if __name__ == '__main__':
	default_width = 8
	for arg in sys.argv:
		if (arg.isdecimal() and int(arg) > 3):
			default_width = int(arg)
			break
		
	if (default_width == 8):
		print("Running algorithm with board size of 8. Specify an alternative Chess board size for N-Queens as a command line argument.")
	
	board = nqueens(default_width)
	print(board)
	print_board(board)