鱼C论坛

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

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

[复制链接]
 楼主| 发表于 2015-1-25 17:42:47 | 显示全部楼层
挥舞乾坤 发表于 2015-1-25 17:36
SBW...,.WWB..,..WW..,......,...WW.,..BWBE

地图大小:6 * 6

RBLDDDRRRRRDDLBR这样是18哦~。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

没有考虑回路,看来要推翻重写了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-1-25 23:01:07 | 显示全部楼层
难度好高:sad
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-1-26 11:36:40 | 显示全部楼层

回帖奖励 +1 鱼币

题目没怎么看懂~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-1-26 11:56:59 | 显示全部楼层
戴宇轩 发表于 2015-1-25 22:51
版本: Python 2.7.5
成品

["SBW...",".WWB..","..WW..","......","...WW.","..BWBE"]
["S..BW.",".WWWWW",".W....",".W.W.B",".W.W..","...W.E"]
["S.BB.E"]
结果都不对哦。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-1-26 20:58:42 | 显示全部楼层

回帖奖励 +1 鱼币

C语言不会,不过支持各位大神
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-1-26 21:11:32 | 显示全部楼层
戴宇轩 发表于 2015-1-25 22:51
版本: Python 2.7.5
成品

如果我作业做完比较早, 应该能拿到iPad想想新思路, 否则我明天才有时间更新

评分

参与人数 1鱼币 +10 收起 理由
wei_Y + 10 明天再来,今天木有了。。

查看全部评分

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

使用道具 举报

 楼主| 发表于 2015-1-26 21:47:36 | 显示全部楼层
戴宇轩 发表于 2015-1-26 21:11
如果我作业做完比较早, 应该能拿到iPad想想新思路, 否则我明天才有时间更新

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

使用道具 举报

发表于 2015-1-26 23:46:58 | 显示全部楼层

可读性和效率和行数, 能不能麻烦下按重要性从大到小排下序? 习惯了行数优先的风格
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-1-27 10:57:17 | 显示全部楼层
戴宇轩 发表于 2015-1-26 23:46
可读性和效率和行数, 能不能麻烦下按重要性从大到小排下序? 习惯了行数优先的风格

效率>可读性,无行数要求。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-1-27 17:06:16 | 显示全部楼层

回帖奖励 +1 鱼币

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

使用道具 举报

发表于 2015-1-27 21:13:26 | 显示全部楼层
C不懂,顶大神~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-1-28 00:06:26 | 显示全部楼层

回帖奖励 +1 鱼币

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

使用道具 举报

发表于 2015-1-28 12:12:24 | 显示全部楼层

回帖奖励 +1 鱼币

{:1_1:}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-1-28 19:43:10 | 显示全部楼层

回帖奖励 +1 鱼币


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

使用道具 举报

发表于 2015-1-29 12:21:36 | 显示全部楼层

回帖奖励 +1 鱼币

新手来看这个, 真是够虐的……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-1-29 12:24:15 | 显示全部楼层

回帖奖励 +1 鱼币

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

使用道具 举报

 楼主| 发表于 2015-1-29 14:23:33 | 显示全部楼层
戴宇轩 发表于 2015-1-29 13:32
成品2
版本: Python 2.7.5

["S..BW.",".WWWWW",".W....",".W.W.B",".W.W..","...W.E"]
最低时间29
["SBW...",".WWB..","..WW..","......","...WW.","..BWBE"]
最低时间18
任意通过一个就能拿奖品咯~。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

知道了我复习完物理就改进, and这个活动开的真不是时候, 我最近要考期末。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-1-29 15:28:05 | 显示全部楼层
本帖最后由 戴宇轩 于 2015-1-31 13:56 编辑

成品 12
版本: Python 3.4.0a0
  1. import re #分开路径用
  2. import sys #报错用
  3. class Go_to_B: #向加速器移动的类
  4.     def __init__(self, direction, opposite): #要传入四个方向和相反路径字典
  5.         self.result = [] #结果存放处
  6.         self.direction = direction #方向存放处
  7.         self.opposite = opposite #相反路径字典
  8.     def __call__(self, path, field, history): #被调用时
  9.         (x, y) = history[-1] #找到现在位置
  10.         if field[x][y] == 'B': #如果找到了加速器
  11.             self.result.append(path) #结果增加这条路径
  12.             del history[-1];return 0 #推向前一个点, 向其他方向继续寻找
  13.         for i in self.direction: #搜索四个方向
  14.             (x, y) = (history[-1][0] + i[0], history[-1][1] + i[1]) #假定向这个方向移动1格
  15.             if not ((x, y) in history or field[x][y] == 'W'): #如果超出边界 or 走过这个点(非递归造成) or 前面被水挡住了, 就搜索另一个方向
  16.                 history+=[(x, y)] #如果前面是通路, 将这个点加入history, 下次递归就从这个点开始
  17.                 self(path + i[2], field, history) #递归
  18.         del history[-1] #如果找到一条死路(再找就回去了), 就回到上一个点, 继续寻找
  19.     def __str__(self): #被str()时
  20.         self.result.sort(key = len) #找到最短的一条路
  21.         temp = self.result and self.result[0] or '' #如果整个迷宫里没有加速器, 开头结尾路径为空
  22.         return temp + (temp and 'B' or '') + ''.join([self.opposite[i] for i in temp[::-1]]) #并返回
  23. def fix(path): #用来消除路径中的[RL|LR|UD|DU|BB]
  24.     while path.replace('LR', '').replace('RL', '').replace('UD', '').replace('DU', '').replace('BB', '') != path:
  25.         path = path.replace('LR', '').replace('RL', '').replace('UD', '').replace('DU', '').replace('BB', '')
  26.     return path
  27. def checkroute(data): #主函数
  28.     direction = ((0, 1, 'R'), (1, 0, 'D'), (-1, 0, 'U'), (0, -1, 'L')) #定义四个方向
  29.     data = ['W' * (len(data[0]) + 2)] + ['W' + i + 'W' for i in data] + ['W' * (len(data[-1]) + 2)] #给迷宫加上墙壁
  30.     opposite = {'R': 'L', 'U': 'D', 'D': 'U', 'L': 'R'} #相反路径字典
  31.     (start_path, end_path) = ([], []) #开始和结束到加速器的最短距离
  32.     (S_axis, E_axis) = ([], [])
  33.     ##### 这个函数段用于找到S和E的坐标
  34.     x = 0
  35.     for i in data:
  36.         y = 0
  37.         for j in i:
  38.             if j == 'S':S_axis.append((x, y))
  39.             if j == 'E':E_axis.append((x, y))
  40.             y += 1
  41.         x += 1
  42.     ##### 结束
  43.     ##### 判断起点, 终点个数是否正确
  44.     if len(S_axis) != 1:sys.exit('起点个数不正确!')
  45.     if len(E_axis) != 1:sys.exit('终点个数不正确!')
  46.     ##### 结束
  47.     def view_all_path(data): #这个函数用来找到所有路径(不兜圈)
  48.         result = [] #结果路径存放处
  49.         ########## 这个脚本段用来记录起点和终点到加速器后返回的最短距离
  50.         start_path_temp = Go_to_B(direction, opposite)
  51.         start_path_temp('', data, S_axis[:]) #因为Move_to_B()()会把S_axis删光, 浅拷贝一次
  52.         start_path.append(str(start_path_temp))
  53.         end_path_temp = Go_to_B(direction, opposite)
  54.         end_path_temp('', data, E_axis)
  55.         end_path.append(str(end_path_temp))
  56.         ########## 结束
  57.         def serach(path, field, history): #搜索函数
  58.             (x, y) = history[-1] #找到现在位置
  59.             if field[x][y] == 'E': #如果找到了终点
  60.                 result.append(path) #结果增加这条路径
  61.                 del history[-1];return 0 #推向前一个点, 向其他方向继续寻找
  62.             for i in direction: #搜索四个方向
  63.                 (x, y) = (history[-1][0] + i[0], history[-1][1] + i[1]) #假定向这个方向移动1格
  64.                 if not ((x, y) in history or field[x][y] == 'W'): #如果超出边界 or 走过这个点(非递归造成) or 前面被水挡住了, 就搜索另一个方向
  65.                     history+=[(x, y)] #如果前面是通路, 将这个点加入history, 下次递归就从这个点开始
  66.                     serach(path + i[2] + ('B' if field[x][y] == 'B' else ''), field, history) #递归
  67.             del history[-1] #如果找到一条死路(再找就回去了), 就回到上一个点, 继续寻找
  68.         serach('', data, S_axis) #搜索, 此时路径为空, 传入起点位置
  69.         return result #将找到的所有路径返回
  70.         ###### 寻找路径函数结束
  71.     raw_path = view_all_path(data) #得到只走一次的路径, 传入迷宫
  72.     factored_path = [] #所有(含开头结尾加速器)路径存放处
  73.     start_path = start_path[0] #开头加速器路径
  74.     end_path = end_path[0] #结尾加速器路径
  75.     final_path = [] #最终路径
  76.     least = {} #时间与路径的字典
  77.     for i in raw_path: #一共有四种路径(原路径, 开头加速器 + 原路径, 原路径 + 结尾加速器, 开头加速器 + 原路径 + 结尾加速器)
  78.         factored_path += [i, start_path + i, i + end_path, start_path + i + end_path]
  79.     for i in [fix(i) for i in factored_path]: #逐个查看消除重复路径后的路径
  80.         if i.count('B') in (0, 2): #如果有0个或2个B在路径内
  81.             final_path.append(i) #直接放入正确路径
  82.         elif i.count('B') > 2: #如果有多于两个B, 仅保留最前和最后的B(这样时间少)
  83.             frount = i.index('B') + 1
  84.             back = len(i) - i[::-1].index('B') - 1
  85.             final_path.append(i[:frount] + i[frount:back].replace('B', '') + i[back - 1:])
  86.         final_path.append(i.replace('B', '')) #再加入一个全程不加速的路径(以上判断皆通过此处)
  87.     for i in final_path: #查看所有正确路径
  88.         all_time = 0 #每条路径时间一开始是0
  89.         split_path = re.findall('[URLD]+(?=B)|B[URLD]+B|(?<=B)[URLD]+|[URLD]+', i) #用正则表达式将路径分开, 如下
  90.         #例子: 'RRRRRBUUUBLLL'   ------>   ['RRRRR', 'BUUUB', 'LLL']
  91.         for j in split_path: #逐个查看所有分开路径
  92.             if j[0] == 'B': #如果处于加速状态
  93.                 all_time += len(j) #时间和加上加速后的路径长度(单位: 1)
  94.             else: #否则(非加速状态)
  95.                 all_time += len(j) * 2 #时间和加上现在路径的总长度(单位: 2)
  96.         least[all_time] = i #least的现在总时间对应现在的路径
  97.     print('最短时间: %s 路径:' % min(least), least[min(least)]) #输出最短的时间和对应的路径, Done!
  98. # -*- -*- -*- -*- -*- # 测试数据
  99. No_1 = ["SBW...",".WWB..","..WW..","......","...WW.","..BWBE"]
  100. No_2 = ["S..BW.",".WWWWW",".W....",".W.W.B",".W.W..","...W.E"]
  101. checkroute(No_1)
  102. checkroute(No_2)
复制代码


评分

参与人数 1鱼币 +5 收起 理由
挥舞乾坤 + 5 有时间再看看,学习学习

查看全部评分

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-26 21:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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