走迷宫是acm经常出现的一类问题,有多重方法可以解决,例如A*,广度优先搜索,深度优先搜索等.广度优先搜素可以保证一旦找到路径,必定为最短路径.
广度优先搜索的实例如下(在12*12的迷宫中从(1,1)走到(10,10),边界是围墙,0为可通过,1为不可通过):
class Node(object): # x,y,parent node def __init__(self,x,y,p=None): self.x = x self.y = y self.p = p # check movement from self to n def decode(self,n): md = {(1,0):'S', (-1,0):'N', (0,1):'E', (0,-1):'W'} return md[(self.y-n.y,self.x-n.x)] # str() def __repr__(self): return '(%s,%s)' % (str(self.y),str(self.x)) def checkio(data): # find the path with breadth first search visited = [[0]*12 for i in range(12)] # visited position path = [Node(1,1)] # path position visited[1][1] = 1 # start position # success flag flag = 0 cv = Node(0,0) # used for retrieve path # start loop while len(path)>0: cv = path.pop(0) # first node x,y = cv.x,cv.y # col, row visited[y][x] = 1 # mark visited if x==10 and y==10: # reach the outlet flag = 1 break # right if x<10 and data[y][x+1]==0 and visited[y][x+1]!=1: path.append(Node(x+1,y,cv)) # down if y<10 and data[y+1][x]==0 and visited[y+1][x]!=1: path.append(Node(x,y+1,cv)) # left if x>1 and data[y][x-1]==0 and visited[y][x-1]!=1: path.append(Node(x-1,y,cv)) # up if y>1 and data[y-1][x]==0 and visited[y-1][x]!=1: path.append(Node(x,y-1,cv)) if flag: cc = cv # current node nc = cv.p # parent node s = '' # path move ps = [] # path position while nc: # decode path ps.append(cc) s += cc.decode(nc) cc = nc nc = nc.p ps.append((1,1)) # output path ## print ps[::-1] # output decoded path move return s[::-1] else: return 'No path' #This code using only for self-checking and not necessary for auto-testing if __name__ == '__main__': print(checkio([ [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], [1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1], [1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1], [1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1], [1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1], [1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1], [1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1], [1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 1], [1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1], [1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]])) #be carefull with infinity loop print(checkio([ [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] ])) print(checkio([ [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1], [1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1], [1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1], [1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1], [1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1], [1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1], [1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1], [1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1], [1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1], [1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], ]))
No comments :
Post a Comment