鱼C论坛

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

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

[复制链接]
发表于 2015-1-30 20:12:55 | 显示全部楼层

回帖奖励 +1 鱼币

有意思,可惜我不会做:cry
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-1-30 20:13:18 | 显示全部楼层
wei_Y 发表于 2015-1-29 14:23
["S..BW.",".WWWWW",".W....",".W.W.B",".W.W..","...W.E"]
最低时间29
["SBW...",".WWB..","..WW.."," ...

楼主, 这个迷宫我做出来是28秒, 看看你写的脚本是不是有什么问题?
["S..BW.",".WWWWW",".W....",".W.W.B",".W.W..","...W.E"] 最短时间: 28 路径: RRRBLLLDDDDDRRUUURRRBDD

评分

参与人数 1鱼币 +30 收起 理由
wei_Y + 30

查看全部评分

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

使用道具 举报

发表于 2015-1-30 21:11:52 | 显示全部楼层
wei_Y 发表于 2015-1-25 17:42
RBLDDDRRRRRDDLBR这样是18哦~。

不好意思, 刚才做错了, 你的程序是对的

评分

参与人数 1鱼币 +30 收起 理由
wei_Y + 30

查看全部评分

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

使用道具 举报

发表于 2015-1-31 15:20:19 | 显示全部楼层
本帖最后由 挥舞乾坤 于 2015-1-31 16:51 编辑

完整版,测试了所有版主提供的路径,并可以实现10*10,支持随机起点和终点,再大的就没有测试了,欢迎测试,鉴于之前版本因为寻路全部由递归完成(递归遍历所有路径真是个大工程)耗时太久,所以又出了这个版本!
  1. import copy

  2. #找到指定地图中,两点之间的最短路径
  3. def maze(data, p1, p2):
  4.     'data:迷宫数据,p1:起点,p2终点'
  5.    
  6.     rows = len(data) # 地图行数
  7.     column = len(data[0]) #地图列数
  8.     result = [] # 可达路径列表
  9.     x, y = p1

  10.     # fx可移动的方向
  11.     fx = [[0, 1, 'R'], [1, 0, 'D'], [0, -1, 'L'], [-1, 0, 'U']]

  12.     #递归找到最短路径,添加到result列表中
  13.     def move(path, x, y, maps):
  14.         'path:存放方向字串,x,y:行,列坐标,maps:迷宫地图'
  15.         maps[x][y] = 'W' #记录走过的点,防止重复
  16.         if (x, y) == p2:
  17.             result.append(path) #如果当前坐标等于终点坐标,把路径添加到列表

  18.          #在方向列表中逐个尝试移动   
  19.         for i in fx[:]:
  20.             if not (0 <= x + i[0] < rows) or not (0 <= y + i[1] < column):
  21.                 continue
  22.             if maps[x + i[0]][y + i[1]] in '.SBE':
  23.                 move('%s%s' % (path,i[2]), x + i[0], y + i[1], maps)

  24.     fx_ = re_move(fx) #fx_是一个存放所有方向排列组合的生成器,一共24种组合

  25.     #根据不同的方向排列组合循环调用move,每调用一次添加一个可达路径
  26.     for each in fx_:
  27.         fx = each
  28.         move('', x, y, copy.deepcopy(data))

  29.      #返回最短的路径   
  30.     result = {len(x):x for x in result}
  31.     return result[min(result)]

  32. #生成方向的排列组合,返回一个生成器
  33. def re_move(fx):
  34.     for pos1 in fx:
  35.         for pos2 in fx:
  36.             if pos2 == pos1:continue
  37.             for pos3 in fx:
  38.                 if pos3 in(pos1,pos2):continue
  39.                 for pos4 in fx:
  40.                     if pos4 in(pos1,pos2,pos3):continue
  41.                     yield([pos1,pos2,pos3,pos4])

  42. #找到指定字符在地图中的位置,返回一个坐标列表                           
  43. def find_items(data,item):
  44.     'data:地图数据,item:要找的字符'
  45.     result = []
  46.     for x,each_row in enumerate(data):
  47.         for y,each_str in enumerate(each_row):
  48.             if each_str == item:
  49.                 result.append((x,y))
  50.     return result

  51. #找到包含加速的路径,返回一个路径列表
  52. def spend_path(data, s, e, blist):
  53.     'data:地图数据,s:起点,e:终点,blist:所有加速点的列表'
  54.     result = []

  55.     #循环组合出所有加速路径
  56.     for each in blist:
  57.         for other in blist:
  58.             if each == other:continue
  59.             path = ''
  60.             part1 = maze(data, s, each)
  61.             part2 = maze(data, each, other)
  62.             part3 = maze(data, other, e)
  63.             path = '%s%s%s%s%s' % (part1, 'B', part2, 'B', part3)
  64.             result.append(path)
  65.     return result


  66. #计算最短路径,返回一个最短的耗时,和最短路径的字典
  67. def calc_time(path_list):
  68.     'path_list:路径列表'
  69.     result = {}
  70.     spend = False
  71.     for each_path in path_list:
  72.         count = 0
  73.         for each_char in each_path:
  74.             if each_char == 'B':
  75.                 spend = not spend
  76.                 count += 1
  77.                 continue
  78.             sep = 1 if spend else 2
  79.             count += sep
  80.         result.update({count:each_path})
  81.     return min(result),result
  82.             
  83.         
  84.    
  85. #主函数了     
  86. def maps(data):
  87.     data = [list(e.upper()) for e in data]
  88.     rows = len(data)
  89.     column = len(data[0])
  90.     for each in data:
  91.         print(each)

  92.     path_list = []
  93.     S = find_items(data,'S')[0] #找起点
  94.     E = find_items(data,'E')[0] #找终点
  95.     B_list = find_items(data,'B') #找所有加速点

  96.     #加速点大余1个,path_list 获得所有加速路径
  97.     if len(B_list) > 1:
  98.         path_list = spend_path(data, S, E, B_list)

  99.     #加入起点到终点,不走加速的路径
  100.     path_list.append(maze(data, S, E))

  101.     #计算所有路径耗时,min_time最小耗时,min_path最短路径
  102.     min_time,min_path = calc_time(path_list)
  103.     min_path = min_path[min_time]

  104.     print('地图大小%d * %d' % (rows,column))
  105.     print('最佳路径:#%s' % min_path)
  106.     print('最低耗时:%d' % min_time)
  107.     print('=' * 60)

  108. data0 = ["S.....","......","......","......","......",".....E"]
  109. data1 = ["S...","....","B.WB","..WE"]
  110. data2 = ["S...","....","B..B","..WE"]
  111. data3 = ["S.BB.E"]
  112. data4 = ["S.W...","..WB..","..WW..","....B.","....W.","..B.BE"]
  113. data5 = ["SBW...",".WWB..","..WW..","......","...WW.","..BWBE"]
  114. data6 = ["S..BW.",".WWWWW",".W....",".W.W.B",".W.W..","...W.E"]
  115. data7 = ["EBW.S.",".WWB..","..WW..","......","...WW.","..BWB."]
  116. data8 = ["S..BW.....",".WWWWWw...",".Wbw......",".W.W.Bw...",".W.W..www.","...W..w...","......w...",".wwww.w..b","..........",".....b..be"]
  117. data9 = ['s.........','..........','..........','..........','..........','..........','..........','..........','..........','.........e']

  118. maps(data0)
  119. maps(data1)
  120. maps(data2)
  121. maps(data3)
  122. maps(data4)
  123. maps(data5)
  124. maps(data6)
  125. maps(data7)
  126. maps(data8)
  127. maps(data9)
复制代码


测试数据:
  1. data0 = ["S.....","......","......","......","......",".....E"]
  2. data1 = ["S...","....","B.WB","..WE"]
  3. data2 = ["S...","....","B..B","..WE"]
  4. data3 = ["S.BB.E"]
  5. data4 = ["S.W...","..WB..","..WW..","....B.","....W.","..B.BE"]
  6. data5 = ["SBW...",".WWB..","..WW..","......","...WW.","..BWBE"]
  7. data6 = ["S..BW.",".WWWWW",".W....",".W.W.B",".W.W..","...W.E"]
  8. data7 = ["EBW.S.",".WWB..","..WW..","......","...WW.","..BWB."]
  9. data8 = ["S..BW.....",".WWWWWw...",".Wbw......",".W.W.Bw...",".W.W..www.","...W..w...","......w...",".wwww.w..b","..........",".....b..be"]
  10. data9 = ['s.........','..........','..........','..........','..........','..........','..........','..........','..........','.........e']
复制代码

点评

我很赞同!: 5.0
我很赞同!: 5
不用写那么全啦。效率高!  发表于 2015-1-31 16:42
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-1-31 16:54:49 | 显示全部楼层
挥舞乾坤 发表于 2015-1-31 15:20
完整版,测试了所有版主提供的路径,并可以实现10*10,支持随机起点和终点,再大的就没有测试了,欢迎测试,鉴于 ...

@wei_Y 在checkio,看见这个题了,题目要求10*10,就按着测试了一下,这样的活动以后要常常搞才好,用心的写完一个程序,真的能学到好多新东西,支持!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-1-31 16:59:28 | 显示全部楼层
挥舞乾坤 发表于 2015-1-31 16:54
@wei_Y 在checkio,看见这个题了,题目要求10*10,就按着测试了一下,这样的活动以后要常常搞才好,用心的写完 ...

嗯,以后搞的话只有鱼币奖励咯。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-2-3 20:02:19 | 显示全部楼层
python刚学比较水= =#为了鱼币也是蛮拼的,鱼c的代码的格式好奇怪,编辑不了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-2-5 14:20:39 | 显示全部楼层

回帖奖励 +1 鱼币

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

使用道具 举报

发表于 2015-2-5 15:04:43 | 显示全部楼层

回帖奖励 +1 鱼币

对啊,看帖回帖,不知不觉就升级了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-2-10 11:13:17 | 显示全部楼层

回帖奖励 +1 鱼币

我没有参加成功
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-2-10 11:13:53 | 显示全部楼层
能让我赚点鱼币吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-2-21 17:30:43 | 显示全部楼层

回帖奖励 +1 鱼币

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

使用道具 举报

发表于 2015-2-24 09:39:13 | 显示全部楼层

回帖奖励 +1 鱼币

,,看不懂啊,,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-3-1 17:24:59 | 显示全部楼层
我的小烏龜你在哪裏呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-3-22 17:24:54 | 显示全部楼层

回帖奖励 +1 鱼币

只能慢慢学习了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-3-23 06:38:52 | 显示全部楼层

回帖奖励 +1 鱼币

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

使用道具 举报

发表于 2015-3-23 17:49:05 | 显示全部楼层

回帖奖励 +1 鱼币

支持学习:loveliness:
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-4-10 12:15:57 | 显示全部楼层

回帖奖励 +1 鱼币

我爱鱼C,
正如我爱小甲鱼,
他那呱唧呱唧
呱唧呱唧
呱唧呱唧的声音,
总缠绕于我的脑海,久久不肯散去……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-4-10 14:42:24 | 显示全部楼层
我要鱼币
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-4-10 18:25:41 | 显示全部楼层
我爱鱼C,
正如我爱小甲鱼,
他那呱唧呱唧
呱唧呱唧
呱唧呱唧的声音,
总缠绕于我的脑海,久久不肯散去……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-18 10:50

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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