import random from random import choice import sys def findConflicts(board, queen): n = len(board) conflicts = 0 # W for i in range(0,queen): if(board[i] == board[queen]): conflicts += 1 break # E for i in range(queen+1, n): if(board[i] == board[queen]): conflicts += 1 break # NW for i in range(0,queen): if(board[i] == board[queen] + queen - i): conflicts += 1 break # SW for i in range(0,queen): if(board[i] == board[queen] - queen + i): conflicts += 1 break # NE for i in range(queen+1, n): if(board[i] == board[queen] - queen + i): conflicts += 1 break # SE for i in range(queen+1, n): if(board[i] == board[queen] + queen - i): conflicts += 1 break return conflicts def checkBoard(board): for i in range(0, len(board)): if(findConflicts(board, i) > 0): return False return True def solveBoard(board): colNames = ['a','b','c','d','e','f','g','h'] steps = 10000 moves = 0 lastMoved = None for i in range(0, steps): if(checkBoard(board) == True): print "moves: "+str(moves) return board randQueen = random.randint(0, len(board)-1) currentConflicts = findConflicts(board, randQueen) if(currentConflicts > 0 and randQueen != lastMoved): colConflicts = [] for row in range(1, len(board)+1): testBoard = list(board) testBoard[randQueen] = row colConflicts.append(findConflicts(testBoard, randQueen)) minConflict = min(colConflicts) minConflictRows = [t for t, u in enumerate(colConflicts) if u == minConflict] newRow = choice(minConflictRows)+1 if(board[randQueen] != newRow): print colNames[randQueen]+str(board[randQueen])+" -> "+colNames[randQueen]+str(newRow) board[randQueen] = newRow lastMoved = randQueen moves += 1 return None if(len(sys.argv) >= 2): board = [int(x) for x in sys.argv[1].split(",")] else: print "missing board argument" sys.exit(0) colNames = ['a','b','c','d','e','f','g','h'] boardToSolve = list(board) for i in range(len(boardToSolve)): boardToSolve[i] = colNames[i]+str(boardToSolve[i]) print ",".join([str(n) for n in boardToSolve]) board = solveBoard(board) if(board is None): print "Solution not found" else: for i in range(len(board)): board[i] = colNames[i]+str(board[i]) print ",".join([str(n) for n in board])