热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

2017网易游戏雷火盘古实习生招聘笔试真题:推箱子[python]

[编程题]推箱子时间限制:1秒空间限制:32768K大家一定玩过“推箱子”这个经典的游戏。具体规则就是在一个N*M的地图上,有1个玩家、1个箱子、1个目的地以及若干障碍,其余是空地。玩家
'''
[编程题] 推箱子
时间限制:1秒
空间限制:32768K
大家一定玩过“推箱子”这个经典的游戏。具体规则就是在一个N*M的地图上,
有1个玩家、1个箱子、1个目的地以及若干障碍,其余是空地。玩家可以往上下左右4个方向移动,
但是不能移动出地图或者移动到障碍里去。如果往这个方向移动推到了箱子,箱子也会按这个方向移动一格,
当然,箱子也不能被推出地图或推到障碍里。当箱子被推到目的地以后,游戏目标达成。
现在告诉你游戏开始是初始的地图布局,请你求出玩家最少需要移动多少步才能够将游戏目标达成。 
输入描述:
每个测试输入包含1个测试用例
第一行输入两个数字N,M表示地图的大小。其中0接下来有N行,每行包含M个字符表示该行地图。其中 . 表示空地、X表示玩家、*表示箱子、#表示障碍、@表示目的地。
每个地图必定包含1个玩家、1个箱子、1个目的地。




输出描述:
输出一个数字表示玩家最少需要移动多少步才能将游戏目标达成。当无论如何达成不了的时候,输出-1。


输入例子1:
4 4
....
..*@
....
.X..
6 6
...#..
......
#*##..
..##.#
..X...
.@#...


输出例子1:
3
11
'''



'''
解题思路:深度优先搜索算法(bfs)
  搜索前须知:
    用一个四元元组(br, bc, hr, hc)跟踪搜索过程中box_row, box_column, human_row, human_column
    一个集合searched{}记录已经搜索过的区域
    用explore函数来探索human在目前位置时可以到达的相邻区域:
        检测human的四个邻居,如果不是box,不是障碍,且没有超出地图,且没有被探索过,则把它加入到可以到达的相邻区域
        如果human的邻居中有box,则要在human和box的直线多探索一个位置,确定这个位置不是障碍,没有超出地图,且没有被探索过,则把她加入到可以到达的相邻区域
        检测完四个邻居后,返回可以到达的相邻区域
  开始bfs:
    使用初始box和human的位置组成的四元元组作为搜索的起点,目标点为搜索的目标点
    使用search函数进行搜索,search函数有两个参数(1、带检测的四元元组集合 2、目标点):
        遍历四元元组集合,如果四元元组中的box位置和目标点位置重合,则返回0,
        如果不重合,则将用explore求出四元元组可以到达的相邻区域,并存储于集合wait_search_set中
        若遍历完没有发现box位置和目标点位置重合的点,对集合wait_search_set进行判断,若wait_search_set为空,则搜索失败,返回-1
        若wait_search_set不为空,则把wait_search_set和目标点再次放入search函数进行递归搜索,记录search函数的返回值为steps
        若steps为-1,表示递归执行的内层search函数没有找到合适的路径,则外层search函数也返回-1
        若steps不为-1,表示递归执行的内层search函数找到了合适的路径,则外层search函数返回steps+1,表示步数+1
  结束bfs:
    输出search函数返回的结果
'''


'''
代码运行结果:
答案正确:恭喜!您提交的程序通过了所有的测试用例

'''


N, M = [each for each in map(int, input().split())]

MAP = []
for i in range(N):
MAP.append([each for each in input()])

for i in range(N):
for j in range(M):
if MAP[i][j] == '*':
BOX = (i, j)
elif MAP[i][j] == 'X':
PLAYER = (i, j)
elif MAP[i][j] == '@':
TARGET = (i, j)


def explore(pos):
reachable_neighbor = set()
if (pos[2]-1, pos[3]) == pos[:2]: # 如果玩家在箱子下方
if pos[2]-2 >= 0 and MAP[pos[2]-2][pos[3]] != '#' and (pos[0]-1, pos[1], pos[2]-1, pos[3]) not in searched:
reachable_neighbor.add((pos[0]-1, pos[1], pos[2]-1, pos[3]))
else:
if pos[2]-1 >= 0 and MAP[pos[2]-1][pos[3]] != '#' and (pos[0], pos[1], pos[2]-1, pos[3]) not in searched:
reachable_neighbor.add((pos[0], pos[1], pos[2]-1, pos[3]))

if (pos[2]+1, pos[3]) == pos[:2]: # 如果玩家在箱子上方
if pos[2]+2 reachable_neighbor.add((pos[0]+1, pos[1], pos[2]+1, pos[3]))
else:
if pos[2]+1 reachable_neighbor.add((pos[0], pos[1], pos[2]+1, pos[3]))

if (pos[2], pos[3]-1) == pos[:2]: # 如果玩家在箱子右侧
if pos[3]-2 >= 0 and MAP[pos[2]][pos[3]-2] != '#' and (pos[0], pos[1]-1, pos[2], pos[3]-1) not in searched:
reachable_neighbor.add((pos[0], pos[1]-1, pos[2], pos[3]-1))
else:
if pos[3]-1 >= 0 and MAP[pos[2]][pos[3]-1] != '#' and (pos[0], pos[1], pos[2], pos[3]-1) not in searched:
reachable_neighbor.add((pos[0], pos[1], pos[2], pos[3]-1))

if (pos[2], pos[3]+1) == pos[:2]: # 如果玩家在箱子左侧
if pos[3]+2 reachable_neighbor.add((pos[0], pos[1]+1, pos[2], pos[3]+1))
else:
if pos[3]+1 reachable_neighbor.add((pos[0], pos[1], pos[2], pos[3]+1))

return reachable_neighbor


def search(current_pos_set, target):
wait_search_set = set()
for each_pos in current_pos_set:
if each_pos[:2] == target:
return 0
else:
searched.add(each_pos)
wait_search_set.update(explore(each_pos))
if wait_search_set:
steps = search(wait_search_set, target)
if steps != -1:
return 1 + steps
else:
return -1
else:
return -1

searched = set()
current_pos = set()
current_pos.add((BOX[0], BOX[1], PLAYER[0], PLAYER[1])) # current_pos = (br, bc, hr, hc)
print(search(current_pos, TARGET))



推荐阅读
  • 本文整理了315道Python基础题目及答案,帮助读者检验学习成果。文章介绍了学习Python的途径、Python与其他编程语言的对比、解释型和编译型编程语言的简述、Python解释器的种类和特点、位和字节的关系、以及至少5个PEP8规范。对于想要检验自己学习成果的读者,这些题目将是一个不错的选择。请注意,答案在视频中,本文不提供答案。 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 本文介绍了在使用Python中的aiohttp模块模拟服务器时出现的连接失败问题,并提供了相应的解决方法。文章中详细说明了出错的代码以及相关的软件版本和环境信息,同时也提到了相关的警告信息和函数的替代方案。通过阅读本文,读者可以了解到如何解决Python连接服务器失败的问题,并对aiohttp模块有更深入的了解。 ... [详细]
  • 本文介绍了在处理不规则数据时如何使用Python自动提取文本中的时间日期,包括使用dateutil.parser模块统一日期字符串格式和使用datefinder模块提取日期。同时,还介绍了一段使用正则表达式的代码,可以支持中文日期和一些特殊的时间识别,例如'2012年12月12日'、'3小时前'、'在2012/12/13哈哈'等。 ... [详细]
  • Python爬虫中使用正则表达式的方法和注意事项
    本文介绍了在Python爬虫中使用正则表达式的方法和注意事项。首先解释了爬虫的四个主要步骤,并强调了正则表达式在数据处理中的重要性。然后详细介绍了正则表达式的概念和用法,包括检索、替换和过滤文本的功能。同时提到了re模块是Python内置的用于处理正则表达式的模块,并给出了使用正则表达式时需要注意的特殊字符转义和原始字符串的用法。通过本文的学习,读者可以掌握在Python爬虫中使用正则表达式的技巧和方法。 ... [详细]
  • C语言自带的快排和二分查找
    Author🚹:CofCaiEmail✉️:cai.dongjunnexuslink.cnQQ😙:1664866311personalPage&#x ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • 本文详细介绍了GetModuleFileName函数的用法,该函数可以用于获取当前模块所在的路径,方便进行文件操作和读取配置信息。文章通过示例代码和详细的解释,帮助读者理解和使用该函数。同时,还提供了相关的API函数声明和说明。 ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • 本文介绍了如何使用python从列表中删除所有的零,并将结果以列表形式输出,同时提供了示例格式。 ... [详细]
  • 企业数据应用挑战及元数据管理的重要性
    本文主要介绍了企业在日常经营管理过程中面临的数据应用挑战,包括数据找不到、数据读不懂、数据不可信等问题。针对这些挑战,通过元数据管理可以实现数据的可见、可懂、可用,帮助业务快速获取所需数据。文章提出了“灵魂”三问——元数据是什么、有什么用、又该怎么管,强调了元数据管理在企业数据治理中的基础和前提作用。 ... [详细]
  • macOS Big Sur全新设计大版本更新,10+个值得关注的新功能
    本文介绍了Apple发布的新一代操作系统macOS Big Sur,该系统采用全新的界面设计,包括图标、应用界面、程序坞和菜单栏等方面的变化。新系统还增加了通知中心、桌面小组件、强化的Safari浏览器以及隐私保护等多项功能。文章指出,macOS Big Sur的设计与iPadOS越来越接近,结合了去年iPadOS对鼠标的完善等功能。 ... [详细]
  • OpenMap教程4 – 图层概述
    本文介绍了OpenMap教程4中关于地图图层的内容,包括将ShapeLayer添加到MapBean中的方法,OpenMap支持的图层类型以及使用BufferedLayer创建图像的MapBean。此外,还介绍了Layer背景标志的作用和OMGraphicHandlerLayer的基础层类。 ... [详细]
author-avatar
太阳之神sqh
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有