设为首页 收藏本站
查看: 700|回复: 0

[经验分享] Python Challenge (level 24)

[复制链接]
发表于 2017-4-29 11:38:34 | 显示全部楼层 |阅读模式
URI:http://www.pythonchallenge.com/pc/hex/ambiguity.html
Username: butter; password: fly
说明:
--
解题方法
# Copyright for the following five classes by John Eriksson
# <http://arainyday.se/>, 2006. Originally written for the AStar
# library <http://www.pygame.org/projects/9/195/> and released into the
# public domain. Thanks a lot!

import Image

class Path:
def __init__ (self, nodes, totalCost):
self.nodes = nodes
self.totalCost = totalCost
def getNodes (self):
return self.nodes
def getTotalMoveCost (self):
return self.totalCost

class Node:
def __init__ (self, location, mCost, lid, parent = None):
self.location = location
self.mCost = mCost
self.parent = parent
self.score = 0
self.lid = lid
def __eq__ (self, n):
if n.lid == self.lid:
return 1
else:
return 0

class AStar:
def __init__ (self, maphandler):
self.mh = maphandler
def _getBestOpenNode (self):
bestNode = None
for n in self.on:
if not bestNode:
bestNode = n
elif n.score <= bestNode.score:
bestNode = n
return bestNode
def _tracePath (self, n):
nodes = []
totalCost = n.mCost
p = n.parent
nodes.insert(0, n)
while True:
if p.parent is None:
break
nodes.insert(0, p)
p = p.parent
return Path(nodes, totalCost)
def _handleNode (self, node, end):
i = self.o.index(node.lid)
self.on.pop(i)
self.o.pop(i)
self.c.append(node.lid)
nodes = self.mh.getAdjacentNodes(node, end)
for n in nodes:
if n.location == end:
return n
elif n.lid in self.c:
continue
elif n.lid in self.o:
i = self.o.index(n.lid)
on = self.on;
if n.mCost < on.mCost:
self.on.pop(i);
self.o.pop(i);
self.on.append(n);
self.o.append(n.lid);
else:
self.on.append(n);
self.o.append(n.lid);
return None
def findPath (self, fromlocation, tolocation):
self.o = []
self.on = []
self.c = []
end = tolocation
fnode = self.mh.getNode(fromlocation)
self.on.append(fnode)
self.o.append(fnode.lid)
nextNode = fnode
while nextNode is not None:
finish = self._handleNode(nextNode, end)
if finish:
return self._tracePath(finish)
nextNode=self._getBestOpenNode()
return None

class SQ_Location:
def __init__ (self, x, y):
self.x = x
self.y = y
def __eq__ (self, l):
if l.x == self.x and l.y == self.y:
return 1
else:
return 0

class SQ_MapHandler:
def __init__ (self, mapdata, width, height):
self.m = mapdata
self.w = width
self.h = height
def getNode (self, location):
x = location.x
y = location.y
if x < 0 or x >= self.w or y < 0 or y >= self.h:
return None
d = self.m[(y * self.w) + x]
if d == -1:
return None
return Node(location, d, ((y * self.w) + x));
def getAdjacentNodes (self, curnode, dest):
result = []
cl = curnode.location
dl = dest
n = self._handleNode(cl.x + 1, cl.y, curnode, dl.x, dl.y)
if n:
result.append(n)
n = self._handleNode(cl.x - 1, cl.y, curnode, dl.x, dl.y)
if n:
result.append(n)
n = self._handleNode(cl.x, cl.y + 1, curnode, dl.x, dl.y)
if n:
result.append(n)
n = self._handleNode(cl.x, cl.y - 1, curnode, dl.x, dl.y)
if n:
result.append(n)
return result
def _handleNode (self, x, y, fromnode, destx, desty):
n = self.getNode(SQ_Location(x, y))
if n is not None:
dx = max(x, destx) - min(x, destx)
dy = max(y, desty) - min(y, desty)
emCost = dx+dy
n.mCost += fromnode.mCost
n.score = n.mCost + emCost
n.parent = fromnode
return n
return None

def main ():
img = Image.open("maze.png")
maze = img.load()
mapdata = []
# Translate pixel data into something that AStar understands.
for elt in img.getdata():
if elt == (255, 255, 255, 255):
mapdata.append(-1)
else:
mapdata.append(1)
# Define start and destination points.
mapdata[639] = 5
mapdata[410241] = 6
astar = AStar(SQ_MapHandler(mapdata, 641, 641))
start = SQ_Location(639, 0)
end = SQ_Location(1, 640)
p = astar.findPath(start, end)
data = []
# Extract data from "logs".
for node in p.nodes:
if node.location.x % 2 and node.location.y % 2:
data.append(chr(maze[node.location.x, node.location.y][0]))
h = open("unzip-me.zip", "wb")
h.write("".join(data))
h.close()

if __name__ == "__main__":
main()
过关答案:
lake

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-370740-1-1.html 上篇帖子: 频繁集统计 python 封装 下篇帖子: [转]Python 网络爬虫
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

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