Project Euler Problem # 83
In the 5 by 5 matrix below, the minimal path sum from the top left
to the bottom right, by moving left, right, up, and down, is indicated in bold
red and is equal to 2297.
Find the minimal path sum, in matrix.txt (right
click and "Save Link/Target As..."), a 31K text file containing a 80
by 80 matrix, from the top left to the bottom right by moving left, right, up,
and down.
Project Euler Solution # 83 in Python
numberOfNodes = 80 class GraphNode: row = 0 col = 0 data = 0 shortestDistance=0 # distance from source parent=None adjacencyList = [] def __init__(self, row, col, data): self.row = row self.col = col self.data = data self.shortestDistance=0 parent=None def printGraphNode(self): print(self.data), def updateAdjacencyList(self, nodeList): self.adjacencyList=[] if self.row - 1 != -1: self.adjacencyList.append(nodeList[self.row - 1][self.col]) if self.row + 1 != len(nodeList): self.adjacencyList.append(nodeList[self.row + 1][self.col]) if self.col - 1 != -1: self.adjacencyList.append(nodeList[self.row][self.col - 1]) if self.col + 1 != len(nodeList): self.adjacencyList.append(nodeList[self.row][self.col + 1]) def printAdjacencyList(self): for i in range(len(self.adjacencyList)): print self.adjacencyList[i].data, # class ended here... def initialiseSingleSource(nodeList,source): for i in range(len(nodeList)): for j in range(len(nodeList[i])): nodeList[i][j].shortestDistance=2147483647 nodeList[i][j].parent=None source.shortestDistance=source.data def extractMin(Q): mini=0 min=Q[0].shortestDistance for i in range(len(Q)): if Q[i].shortestDistance < min : min=Q[i].shortestDistance mini=i u=Q[mini] Q.remove(Q[mini]) return u def relax(u,v): if v.shortestDistance > u.shortestDistance+v.data: v.shortestDistance=u.shortestDistance+v.data v.parent=u def dijkstra(nodeList,source): initialiseSingleSource(nodeList,source) Q=[] for i in range(len(nodeList)): for j in range(len(nodeList[i])): Q.append(nodeList[i][j]) while len(Q) != 0 : u=extractMin(Q) for i in range(len(u.adjacencyList)): relax(u,u.adjacencyList[i]) test_file = open("a.txt", "r+") myList = test_file.read().split('\n') listLen=len(myList) for i in range(listLen): myList.append(myList[0].split(',')) myList.remove(myList[0]) for i in range(numberOfNodes): for j in range(numberOfNodes): myList[i][j] = int(myList[i][j]) nodeList = [] for i in range(numberOfNodes): nodeList.append([]) for j in range(numberOfNodes): nodeList[i].append(GraphNode(i, j, myList[i][j])) for i in range(numberOfNodes): for j in range(numberOfNodes): nodeList[i][j].updateAdjacencyList(nodeList) dijkstra(nodeList,nodeList[0][0]) print "answer is : ",nodeList[numberOfNodes-1][numberOfNodes-1].shortestDistance
No comments:
Post a Comment