Advertisement
Guest User

knightsTour

a guest
Nov 24th, 2014
139
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.44 KB | None | 0 0
  1. import Queue
  2. class Vertex:
  3.     def __init__(self, key):
  4.         self.id = key
  5.         self.connectedTo = {}
  6.         self.color = 'white'
  7.         self.distance = 0
  8.         self.root = None
  9.        
  10.     def addNeighbor(self, neighbor, weight=0):
  11.         self.connectedTo[neighbor] = weight
  12.        
  13.     def getColor(self):
  14.         return self.color
  15.    
  16.     def setColor(self, c):
  17.         self.color = c
  18.        
  19.     def getDistance(self):
  20.         return self.distance
  21.        
  22.     def setDistance(self, d):
  23.         self.distance = d
  24.        
  25.     def getRoot(self):
  26.         return self.root
  27.        
  28.     def setRoot(self, r):
  29.         self.root = r
  30.        
  31.     def __str__(self):
  32.         return str(self.id) + ' ConnectedTo: ' + str([x.id for x in self.connectedTo])
  33.        
  34.     def getConnections(self):
  35.         return self.connectedTo.keys()
  36.        
  37.     def getId(self):
  38.         return self.id
  39.        
  40.     def getWeight(self, neighbor):
  41.         return self.connectedTo[neighbor]
  42.        
  43. class Graph:
  44.     def __init__(self):
  45.         self.verticies = {}
  46.         self.vertCount = 0
  47.        
  48.     def addVertex(self, key):
  49.         self.vertCount += 1
  50.         newVertex = Vertex(key)
  51.         self.verticies[key] = newVertex
  52.         return newVertex
  53.        
  54.     def getVertex(self, key):
  55.         if key in self.verticies:
  56.             return self.verticies[key]
  57.         else:
  58.             return None
  59.            
  60.     def __contains__(self, key):
  61.         return key in self.verticies
  62.        
  63.     def addEdge(self, f, t, cost=0):
  64.         if f not in self.verticies:
  65.             nv = self.addVertex(f)
  66.         if t not in self.verticies:
  67.             nv = self.addVertex(t)
  68.         self.verticies[f].addNeighbor(self.verticies[t],cost)
  69.        
  70.     def getVerticies(self):
  71.         return self.verticies.keys()
  72.        
  73.     def __iter__(self):
  74.         return iter(self.verticies.values())
  75.        
  76.     def bfs(self, fromKey, toKey):
  77.         start = self.getVertex(fromKey)
  78.        
  79.         self.buildBfsTree(start)
  80.         self.traverse(toKey)
  81.  
  82.     def buildBfsTree(self, start):
  83.         start.setColor('grey')
  84.         start.setDistance(0)
  85.         start.setRoot(None)
  86.         queue = Queue.Queue()
  87.    
  88.         queue.put(start)
  89.    
  90.         while not queue.empty():
  91.             curVertex = queue.get()
  92.             for neighbor in curVertex.getConnections():
  93.                 if neighbor.getColor() == 'white':
  94.                     neighbor.setColor('grey')
  95.                     neighbor.setRoot(curVertex)
  96.                     neighbor.setDistance(curVertex.getDistance()+1)
  97.                     queue.put(neighbor)
  98.             curVertex.setColor('black')
  99.                
  100.     def traverse(self, key):
  101.         x = self.getVertex(key)
  102.         while(x.getRoot()):
  103.             print(x.getId())
  104.             x=x.getRoot()
  105.            
  106.         print(x.getId())
  107.        
  108.        
  109. def flatten(x, y, size):
  110.     return x % size + y*size
  111.    
  112. def genLegalMoves(x, y, size):
  113.     newMoves = []
  114.     legalMoves = [(-1,-2),(-1,2),(-2,-1),(-2,1),(1,-2),(1,2),(2,-1),(2,1)]
  115.    
  116.     for i in legalMoves:
  117.         newX = x+i[0]
  118.         newY = y+i[1]
  119.        
  120.         if(legalCoords(newX, size) and legalCoords(newY, size)):
  121.             newMoves.append((newX, newY))
  122.     return newMoves
  123.    
  124. def legalCoords(x, size):
  125.     if(x >= 0 and x < size):
  126.         return True
  127.     else:
  128.         return False
  129.    
  130. def constructKnightGraph(size):
  131.     g = Graph()
  132.     for i in range(size):
  133.         for j in range(size):
  134.             nodeKey = flatten(i,j, size)
  135.             newPositions = genLegalMoves(i,j,size)
  136.             for edge in newPositions:
  137.                 neighborKey = flatten(edge[0], edge[1], size)
  138.                 g.addEdge(nodeKey, neighborKey)
  139.     return g
  140.    
  141. def knightsTour(depth, path, vertexToExplore, limit):
  142.     vertexToExplore.setColor('grey')
  143.     path.append(vertexToExplore)
  144.     if depth < limit:
  145.         neighborList = list(vertexToExplore.getConnections())
  146.         i=0
  147.         done = False
  148.         while i < len(neighborList) and not done:
  149.             if neighborList[i].getColor() == 'white':
  150.                 done = knightsTour(depth+1, path, neighborList[i], limit)
  151.             i+=1
  152.         if not done:
  153.             path.pop()
  154.             vertexToExplore.setColor('white')
  155.     else:
  156.         done = True
  157.     return done
  158.    
  159. path = []
  160. g = constructKnightGraph(8)
  161. knightsTour(0,path,g.getVertex(0),64)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement