鱼C论坛

 找回密码
 立即注册
楼主: wei_Y

[技术交流] #鱼C五周年嘉年华#算法——送(qiang)快(jiang)递(pin)。--已经结束

[复制链接]
发表于 2015-4-12 03:56:49 | 显示全部楼层

回帖奖励 +1 鱼币

看看!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-4-12 04:07:37 | 显示全部楼层

回帖奖励 +1 鱼币

谢谢lz的帖子,挣鱼币
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-4-12 04:11:19 | 显示全部楼层
7ocx
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-4-13 03:46:53 | 显示全部楼层
好像很难得样子
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-4-19 03:08:54 | 显示全部楼层
谢谢lz给鱼币
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-8-4 10:45:36 | 显示全部楼层

回帖奖励 +1 鱼币

好难啊还有小甲鱼送?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-8-11 23:55:46 | 显示全部楼层
我是来捧场的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-8-12 00:03:01 | 显示全部楼层
我来捧场的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-5-25 00:35:47 | 显示全部楼层
本帖最后由 戴宇轩 于 2017-5-25 00:41 编辑

@wei_Y 最近学算法,看到广度优先搜索,猛然想到这个题目
对于迷宫最短路径来说,广度优先再合适不过了,广度优先不像深度那样找到所有路径,而是从起点一层层地向终点推进,效率惊人...

  1. from queue import Queue

  2. # 定义四个方向
  3. di = (1, 0, -1, 0)
  4. dj = (0, 1, 0, -1)
  5. name = 'DRUL'


  6. '用广度优先搜索算法找两点间最短路径'
  7. # 返回值: 完整的路径, 例如: 'RULDDRD'
  8. # 起点坐标: (sx, sy)
  9. # 终点坐标: (ex, ey)
  10. def minimum(sx, sy, ex, ey):
  11.     passed = [[0] * M for i in range(N)]
  12.     passed[sx][sy] = ''
  13.     que = Queue()
  14.     que.put((sx, sy))
  15.     x, y = -1, -1
  16.     while x != ex or y != ey:
  17.         x, y = que.get()
  18.         for i, j, n in zip(di, dj, name):
  19.             nx, ny = x + i, y + j
  20.             if 0 <= nx < N and 0 <= ny < M and passed[nx][ny] == 0 and maze[nx][ny] != 'W':
  21.                 passed[nx][ny] = '%s%s' % (passed[x][y], n)
  22.                 que.put((nx, ny))
  23.     return passed[ex][ey]


  24. # maze:   迷宫
  25. # N:      迷宫高度
  26. # M:      迷宫宽度
  27. # ups:    加速器位置(列表)
  28. # path:   最短路径
  29. # length: 最短路径长度
  30. def maps(data):
  31.     # 初始化迷宫, 设置高和宽
  32.     global maze, N, M
  33.     maze = [list(i) for i in data]
  34.     N = len(maze)
  35.     M = len(maze[0])

  36.     ups = []

  37.     for x in range(N):
  38.         for y in range(M):
  39.             if maze[x][y] == 'B':
  40.                 ups.append((x, y))
  41.             elif maze[x][y] == 'S':
  42.                 sx, sy = x, y
  43.             elif maze[x][y] == 'E':
  44.                 ex, ey = x, y

  45.     # 先走一遍不经过加速器的路线
  46.     path = minimum(sx, sy, ex, ey)
  47.     length = len(path) * 2

  48.     # 对任意两个加速器, 判断 "先从起点走到第一个加速器, 加速, 从第一个加速器走到第二个加速器, 停止加速, 从第二个加速器走到终点" 的路径是否比原先的路径短. 如果是, 那么替换原先的路径长度和路径
  49.     for i in ups:
  50.         for j in ups:
  51.             a = minimum(sx, sy, *i)
  52.             b = minimum(*i, *j)
  53.             c = minimum(*j, ex, ey)
  54.             new_l = (len(a) + len(c) + 1) * 2 + len(b)
  55.             if new_l < length:
  56.                 length = new_l
  57.                 path = '%sB%sB%s' % (a, b, c)

  58.     return (path, length)


  59. #####################################


  60. data0 = ['S.....', '......', '......', '......', '......', '.....E']
  61. data1 = ['S...', '....', 'B.WB', '..WE']
  62. data2 = ['S...', '....', 'B..B', '..WE']
  63. data3 = ['S.BB.E']
  64. data4 = ['S.W...', '..WB..', '..WW..', '....B.', '....W.', '..B.BE']
  65. data5 = ['SBW...', '.WWB..', '..WW..', '......', '...WW.', '..BWBE']
  66. data6 = ['S..BW.', '.WWWWW', '.W....', '.W.W.B', '.W.W..', '...W.E']
  67. data7 = ['EBW.S.', '.WWB..', '..WW..', '......', '...WW.', '..BWB.']
  68. data8 = ['S..BW.....', '.WWWWWW...', '.WBW......', '.W.W.BW...', '.W.W..WWW.', '...W..W...', '......W...', '.WWWW.W..B', '..........', '.....B..BE']
  69. data9 = ['S.........', '..........', '..........', '..........', '..........', '..........', '..........', '..........', '..........', '.........E']

  70. for i in range(10):
  71.     data = eval('data%d' % (i,))
  72.     print('地图:\n        %s\n\n最短路径: %s\n路径长度: %d\n%s' % ('\n        '.join(data), *maps(data), '=' * 36))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-5-25 17:27:27 | 显示全部楼层
戴宇轩 发表于 2017-5-25 00:35
@wei_Y 最近学算法,看到广度优先搜索,猛然想到这个题目
对于迷宫最短路径来说,广度优先再合适不过了, ...

好久不见,这是要回归的节奏呀。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-24 17:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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