from Numeric import * class EightQueen: def __init__(self, size=8): self.board = zeros((size, size)) self.sizeX, self.sizeY = self.board.shape self.queens = [] self.solutions = [] def decidePositions(self, count=8): if count == 0: return 1 x = self.sizeX - count for y in range(self.sizeY): if self.board[x][y] != 0: continue self.mark(self.board, x, y, 1) # marking self.queens.append( (x, y) ) res = self.decidePositions(count-1) self.mark(self.board, x, y, -1) # unmarking if res: if count == 1: print self.queens self.solutions.append(self.queens[:]) self.queens.pop() else: self.queens.pop() return 0 def mark(self, board, startX, startY, count): board[startX][startY] += count for dx, dy in [(1, 0), (0, 1), (-1, 0), (0, -1), (1, 1), (1, -1), (-1, 1), (-1, -1)]: x, y = startX+dx, startY+dy while 0 <= x < self.sizeX and 0 <= y < self.sizeY: board[x][y] += count x += dx y += dy if __name__ == '__main__': e = EightQueen() e.decidePositions() print 'Total solutions=', len(e.solutions) print e.solutions