[关闭]
@sevenup233 2018-05-06T05:32:16.000000Z 字数 1086 阅读 687

迷宫问题

CodeWar


能不能走出去

题目:给一个如下形式的迷宫,‘.’为路,‘m’为障碍,起点为左上角终点为右下角,能走出返回True,反之为False

  1. maze = "\n".join([
  2. ".....",
  3. "mmmm.",
  4. ".....",
  5. ".mmmm",
  6. "....."
  7. ])

初见:

  1. #回溯法
  2. #观赏
  3. def mazeprint(maze):
  4. print("\n".join(["".join(i) for i in maze])+"\n")
  5. #合法性判断
  6. def valid(maze,x,y):
  7. if (x>=0 and x<len(maze)) and (y>=0 and y<len(maze[0])) and maze[x][y]==".":
  8. return True
  9. else:
  10. return False
  11. #walk函数实现运动
  12. def walk(maze,x=0,y=0):
  13. if x==len(maze)-1 and y==len(maze)-1:
  14. return True
  15. if valid(maze,x,y):
  16. print("start",x,y)
  17. mazeprint(maze)
  18. #o为走过的点
  19. maze[x][y]="o"
  20. mazeprint(maze)
  21. #右
  22. if walk(maze,x,y+1):
  23. return True
  24. #下
  25. elif walk(maze,x+1,y):
  26. return True
  27. #上
  28. elif walk(maze,x-1,y):
  29. return True
  30. #左
  31. elif walk(maze,x,y-1):
  32. return True
  33. else:
  34. #x为死路
  35. maze[x][y]="x"
  36. return False
  37. return False
  38. def path_finder(maze):
  39. return(walk([list(iter(i)) for i in maze.split("\n")]))

亮点答案,同时也是最短路径:

  1. #复平面坐标法
  2. def path_finder(maze):
  3. g = maze.splitlines()
  4. end, bag = len(g[0]) -1 + len(g) * 1j - 1j, {0}
  5. grid = {x + y * 1j for y,l in enumerate(g) for x,c in enumerate(l) if '.' == c}
  6. #x+yj x:横坐标,y:纵坐标
  7. #end:终点
  8. #bag:走过的点
  9. #grid:可走的点
  10. while bag:
  11. if end in bag: return True
  12. grid -= bag
  13. #复数的幂实现四方向运动i^0=1,i^1=i,i^2=-1,i^3=-1
  14. #bag转为新的
  15. bag = grid & set.union(*({z + 1j ** k for k in range(4)} for z in bag))
  16. return False
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注