from pprint import pprint import unittest, random, pdb map = [[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 makeRightDigTuple(aPosition): x=aPosition[0]; y=aPosition[1] result=[] i=0 for num in range(x,-1,-1): if y+i > 7: break result.append((num, y+i)) i+=1 j=1 for num in range(y-1,-1,-1): if x+j > 7: break result.append((x+j, num)) j+=1 result.sort() return result def makeLeftDigTuple(aPosition): x=aPosition[0]; y=aPosition[1] result=[] i=0 for num in range(x,8): if y+i > 7: break result.append((num, y+i)) i+=1 j=1 for num in range(y-1,-1,-1): if x-j < 0: break result.append((x-j,num)) j+=1 result.sort() return result class Queen: def __init__(self, name): self.name = name self.x = self.name-1 self.y = 0 self.setPosition(self.x, self.y) def setPosition(self, ax, ay): if (ax not in range(8)) or (ay not in range(8)): return "impossible" self.remove() self.x = ax self.y = ay map[self.x][self.y] = self.name def getPosition(self): return [self.x, self.y] def remove(self): map[self.x][self.y]=0 def isInRow(self): for tempy in range(8): oldQueen = map[self.x][tempy] if oldQueen != 0 and oldQueen != self.name: return oldQueen def isInColumn(self): for tempx in range(8): oldQueen = map[tempx][self.y] if oldQueen != 0 and oldQueen != self.name: return oldQueen def isInRightDig(self): for tempx,tempy in makeRightDigTuple(self.getPosition()): oldQueen = map[tempx][tempy] if oldQueen !=0 and oldQueen != self.name: return oldQueen def isInLeftDig(self): for tempx,tempy in makeLeftDigTuple(self.getPosition()): oldQueen = map[tempx][tempy] if oldQueen !=0 and oldQueen != self.name: return oldQueen def isFight(self): return self.isInRow() or self.isInColumn() or \ self.isInRightDig() or self.isInLeftDig() def moveRight(self): mr = self.setPosition(self.x, self.y+1) if mr == "impossible": return "impossible" def iterate(q, name): while 1: if q[name].isFight() is None and q[name].getPosition()[1] != 7: break a = q[name].moveRight() if a: q[name].remove() q = movePreviousQueen(q, name-1) q[name].setPosition(name-1, 0) continue def movePreviousQueen(q, name): q[name].moveRight() if name == 1: return q iterate(q, name) return q def makeQueensDontFight(): q = {} for name in range(1,9): q[name] = Queen(name) iterate(q, name) return q class TestEightQueenProblem(unittest.TestCase): def setUp(self): for i in range(8): for j in range(8): map[i][j]=0 def tearDown(self): self.setUp() def testIntialPosition(self): q1 = Queen(1) q1.setPosition(0,0) self.assertEquals([0,0],q1.getPosition()) def testRowCheck(self): q1=Queen(1);q2=Queen(2) q2.setPosition(0,1) self.assertEquals(1, q2.isInRow()) q2.setPosition(1,0) self.assertEquals(None, q2.isInRow()) def testColumnCheck(self): q1=Queen(1);q2=Queen(2) q2.setPosition(0,1) self.assertEquals(None, q2.isInColumn()) q2.setPosition(1,0) self.assertEquals(1, q2.isInColumn()) def testMakeRightDigTuple1(self): input = (1,2) expected = [(0,3),(1,2),(2,1),(3,0),] self.assertEquals(expected, makeRightDigTuple(input)) def testMakeRightDigTuple2(self): input = (4,4) expected = [(1, 7), (2, 6), (3, 5), (4, 4), (5, 3), (6, 2), (7, 1)] self.assertEquals(expected, makeRightDigTuple(input)) def testMakeRightDigTuple3(self): input = (6,6) expected = [(5, 7), (6, 6), (7, 5)] self.assertEquals(expected, makeRightDigTuple(input)) def testMakeLeftDigTuple1(self): input = (5,1) expected = [(4,0), (5,1), (6,2), (7,3)] self.assertEquals(expected, makeLeftDigTuple(input)) def testMakeLeftDigTuple2(self): input = (1,5) expected = [(0, 4), (1, 5), (2, 6), (3, 7)] self.assertEquals(expected, makeLeftDigTuple(input)) def testRightDigCheck(self): q1=Queen(1);q2=Queen(2) q1.setPosition(1,2) q2.setPosition(2,1) self.assertEquals(1, q2.isInRightDig()) q2.setPosition(1,0) self.assertEquals(None, q2.isInRightDig()) def testTotal(self): qDict = makeQueensDontFight() print ;pprint(map) for eachQueen in qDict.values(): self.assertEquals(None, eachQueen.isFight()) if __name__=='__main__': unittest.main(argv=('','-v'))