鱼C论坛

 找回密码
 立即注册
查看: 602|回复: 11

[已解决]Python路径问题,求解!

[复制链接]
发表于 2018-10-6 00:33:25 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x

[['SE', 'SW', 'NE', 'NW', 'NW', 'SE', 'NE'],
['NE', 'NE', 'NW', 'SW', 'NE', 'SE', 'SW'],
['SW', 'SE', 'NE', 'SW', 'SE', 'NE', 'SW'],
['SW', 'SE', 'SE', 'SW', 'SW', 'SW', 'NE'],
['SW', 'NW', 'SE', 'SE', 'SE', 'NW', 'SW'],
['NE', 'SW', 'NE', 'SW', 'SW', 'SE', 'NW'],
['NW', 'SW', 'NW', 'NW', 'SE', 'SE', 'SW']]
图片显示的是NE, NW, SE, SW可以走的方向,优先对角线,然后水平,然后垂直,
寻找从这个二维矩阵的中心(3,3)到四个角(0,0),(0,6),(6,0),(6,6)的最短路径,并输出最短路径,如果没有就不用写。
例如:
There is no path to (0, 0)
There is no path to (0,6)
The preferred path to (6, 6) is:
   [(3, 3), (4,3), (4, 4), (5, 5), (6, 6)]
The preferred path to (6,0) is:
   [(3, 3), (4,2), (5,3), (6,2), (5,1), (6,0)]
最佳答案
2018-10-6 06:06:35
本帖最后由 claws0n 于 2018-10-6 06:15 编辑
  1. maze = [['SE', 'SW', 'NE', 'NW', 'NW', 'SE', 'NE'],
  2.         ['NE', 'NE', 'NW', 'SW', 'NE', 'SE', 'SW'],
  3.         ['SW', 'SE', 'NE', 'SW', 'SE', 'NE', 'SW'],
  4.         ['SW', 'SE', 'SE', 'SW', 'SW', 'SW', 'NE'],
  5.         ['SW', 'NW', 'SE', 'SE', 'SE', 'NW', 'SW'],
  6.         ['NE', 'SW', 'NE', 'SW', 'SW', 'SE', 'NW'],
  7.         ['NW', 'SW', 'NW', 'NW', 'SE', 'SE', 'SW']]

  8. def solveMaze(start, dest):
  9.     paths = []
  10.     r = len(maze)
  11.     c = len(maze[0])
  12.     limit = (abs(start[0]-dest[0]) + abs(start[1]-dest[1]))

  13.     def solvingmaze(path, dest):
  14.         nonlocal paths, r, c, limit

  15.         if path[-1] == dest:
  16.             paths.append(path[:])
  17.             return
  18.                
  19.         x = path[-1][0]
  20.         y = path[-1][1]
  21.         if maze[x][y] == 'NE':
  22.             route = [[-1,1], [0,1], [-1,0]]
  23.         elif maze[x][y] == 'NW':
  24.             route = [[-1,-1], [0,-1], [-1,0]]
  25.         elif maze[x][y] == 'SE':
  26.             route = [[1,1], [0,1], [1,0]]
  27.         elif maze[x][y] == 'SW':
  28.             route = [[1,-1], [0,-1], [1,0]]
  29.             
  30.         for each in route:
  31.             node = (path[-1][0] + each[0], path[-1][1] + each[1])
  32.             if -1 not in node and r != node[0] and c != node[1]:
  33.                 if len(path) > limit:
  34.                     return
  35.                 if node in path:
  36.                     break
  37.                 path.append(node)
  38.                 solvingmaze(path,dest)
  39.                 path.pop(-1)
  40.    
  41.     solvingmaze( [ (start[0], start[1]) ] , dest)
  42.     if len(paths) > 1:
  43.         m = r*c
  44.         for each in paths:
  45.             if m > len(each):
  46.                 m = len(each)
  47.                 i = paths.index(each)
  48.         print('The preferred path to {} is:'.format(dest))
  49.         print(paths[i])
  50.     else:
  51.         print('There is no path to {}'.format(dest))

  52. # main()
  53. solveMaze((3,3),(0,0))
  54. solveMaze((3,3),(0,6))
  55. solveMaze((3,3),(6,0))
  56. solveMaze((3,3),(6,6))
复制代码
  1. There is no path to (0, 0)
  2. There is no path to (0, 6)
  3. The preferred path to (6, 0) is:
  4. [(3, 3), (4, 2), (5, 3), (6, 2), (5, 1), (6, 0)]
  5. The preferred path to (6, 6) is:
  6. [(3, 3), (4, 3), (4, 4), (5, 5), (6, 6)]
复制代码
可以知道姐姐读哪一间吗?怎么那么恐怖?
WechatIMG2.jpeg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-10-6 00:51:07 | 显示全部楼层
为什么你总能找到这种题!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-10-6 06:06:35 | 显示全部楼层    本楼为最佳答案   
本帖最后由 claws0n 于 2018-10-6 06:15 编辑
  1. maze = [['SE', 'SW', 'NE', 'NW', 'NW', 'SE', 'NE'],
  2.         ['NE', 'NE', 'NW', 'SW', 'NE', 'SE', 'SW'],
  3.         ['SW', 'SE', 'NE', 'SW', 'SE', 'NE', 'SW'],
  4.         ['SW', 'SE', 'SE', 'SW', 'SW', 'SW', 'NE'],
  5.         ['SW', 'NW', 'SE', 'SE', 'SE', 'NW', 'SW'],
  6.         ['NE', 'SW', 'NE', 'SW', 'SW', 'SE', 'NW'],
  7.         ['NW', 'SW', 'NW', 'NW', 'SE', 'SE', 'SW']]

  8. def solveMaze(start, dest):
  9.     paths = []
  10.     r = len(maze)
  11.     c = len(maze[0])
  12.     limit = (abs(start[0]-dest[0]) + abs(start[1]-dest[1]))

  13.     def solvingmaze(path, dest):
  14.         nonlocal paths, r, c, limit

  15.         if path[-1] == dest:
  16.             paths.append(path[:])
  17.             return
  18.                
  19.         x = path[-1][0]
  20.         y = path[-1][1]
  21.         if maze[x][y] == 'NE':
  22.             route = [[-1,1], [0,1], [-1,0]]
  23.         elif maze[x][y] == 'NW':
  24.             route = [[-1,-1], [0,-1], [-1,0]]
  25.         elif maze[x][y] == 'SE':
  26.             route = [[1,1], [0,1], [1,0]]
  27.         elif maze[x][y] == 'SW':
  28.             route = [[1,-1], [0,-1], [1,0]]
  29.             
  30.         for each in route:
  31.             node = (path[-1][0] + each[0], path[-1][1] + each[1])
  32.             if -1 not in node and r != node[0] and c != node[1]:
  33.                 if len(path) > limit:
  34.                     return
  35.                 if node in path:
  36.                     break
  37.                 path.append(node)
  38.                 solvingmaze(path,dest)
  39.                 path.pop(-1)
  40.    
  41.     solvingmaze( [ (start[0], start[1]) ] , dest)
  42.     if len(paths) > 1:
  43.         m = r*c
  44.         for each in paths:
  45.             if m > len(each):
  46.                 m = len(each)
  47.                 i = paths.index(each)
  48.         print('The preferred path to {} is:'.format(dest))
  49.         print(paths[i])
  50.     else:
  51.         print('There is no path to {}'.format(dest))

  52. # main()
  53. solveMaze((3,3),(0,0))
  54. solveMaze((3,3),(0,6))
  55. solveMaze((3,3),(6,0))
  56. solveMaze((3,3),(6,6))
复制代码
  1. There is no path to (0, 0)
  2. There is no path to (0, 6)
  3. The preferred path to (6, 0) is:
  4. [(3, 3), (4, 2), (5, 3), (6, 2), (5, 1), (6, 0)]
  5. The preferred path to (6, 6) is:
  6. [(3, 3), (4, 3), (4, 4), (5, 5), (6, 6)]
复制代码
可以知道姐姐读哪一间吗?怎么那么恐怖?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-10-6 13:50:53 | 显示全部楼层
claws0n 发表于 2018-10-6 06:06
可以知道姐姐读哪一间吗?怎么那么恐怖?

老师还说,so easy 呢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-10-6 13:55:35 | 显示全部楼层
Bella666 发表于 2018-10-6 13:50
老师还说,so easy 呢!

这题有一定的难度。递归就算了,还排列组合的递归……
不告知?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-10-6 14:38:38 | 显示全部楼层
RIXO 发表于 2018-10-6 00:51
为什么你总能找到这种题!!!

老师给的啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-10-6 16:35:16 | 显示全部楼层

你不会是那种专门学算法的把
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-10-6 18:59:08 | 显示全部楼层
RIXO 发表于 2018-10-6 16:35
你不会是那种专门学算法的把

不像
都是作业吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-10-7 21:39:50 | 显示全部楼层
claws0n 发表于 2018-10-6 18:59
不像
都是作业吧

这只是Python课的作业
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-10-7 21:45:43 | 显示全部楼层
Bella666 发表于 2018-10-7 21:39
这只是Python课的作业

我知道 assignment 2, due by October 28。只是想知道姐姐读哪一间,么么 ^_^
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-10-7 23:19:12 | 显示全部楼层
claws0n 发表于 2018-10-7 21:45
我知道 assignment 2, due by October 28。只是想知道姐姐读哪一间,么么 ^_^

这个私聊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-10-9 13:19:21 | 显示全部楼层
本帖最后由 claws0n 于 2018-10-9 13:56 编辑


姐姐,有问题要讲呀,其他题的
  1. def solveMaze(start, dest):
  2.     paths = []
  3.     r = len(maze)
  4.     c = len(maze[0])
  5.     limit = r*c
  6.     def solvingmaze(path, dest):
  7.         nonlocal paths, r, c, limit
  8.         
  9.         if path[-1] == dest:
  10.             paths.append(path[:])
  11.             return
  12.                
  13.         x = path[-1][0]
  14.         y = path[-1][1]
  15.         if maze[x][y] == 'NE':
  16.             route = [[-1,1], [0,1], [-1,0]]
  17.         elif maze[x][y] == 'NW':
  18.             route = [[-1,-1], [0,-1], [-1,0]]
  19.         elif maze[x][y] == 'SE':
  20.             route = [[1,1], [0,1], [1,0]]
  21.         elif maze[x][y] == 'SW':
  22.             route = [[1,-1], [0,-1], [1,0]]
  23.             
  24.         for each in route:
  25.             node = (path[-1][0] + each[0], path[-1][1] + each[1])
  26.             if -1 not in node and r != node[0] and c != node[1]:
  27.                 if len(path) > limit:
  28.                     return
  29.                 if node in path:
  30.                     continue
  31.                 path.append(node)
  32.                 solvingmaze(path,dest)
  33.                 path.pop(-1)

  34.     solvingmaze( [ (start[0], start[1]) ] , dest)
  35.     if len(paths) > 0:
  36.         m = r*c
  37.         for each in paths:
  38.             if m > len(each):
  39.                 m = len(each)
  40.                 i = paths.index(each)
  41.         print('The preferred path to {} is:'.format(dest))
  42.         print(paths[i],len(paths))
  43.     else:
  44.         print('There is no path to {}'.format(dest))
  45.    
  46. def main():
  47.     solveMaze((3,3),(0,0))
  48.     solveMaze((3,3),(0,6))
  49.     solveMaze((3,3),(6,0))
  50.     solveMaze((3,3),(6,6))
  51.    
  52. main()
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-13 21:12

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表