ThoughtWorks 2019届校招算法、软开迷宫(maze)生成题目

1.校招题目

2.代码


1.校招题目

用计算机生成迷宫是一个很有趣的任务。我们可以用道路网格(Road Grid)来表示迷宫的道路,那么3x3的道路网格(图-1左)可以对应一个7x7的渲染网格(Render Grid)——图-1右的方式(迷宫的墙是灰色的,道路是白色的):

图-1 3 x 3 的 道路网格 及其 渲染网格
如果我们将迷宫 道路网格 两个相邻的 cell 连通,则可以打通道路。如 图 -2 所示:

图-2 3 x 3 连通迷宫的 道路网格 和 渲染网格
连通 道路网格 有如下的约束条件:
● 每一个 cell 只能够直接与相邻正南、正北、正东、正西的 cell 连通。不能够和其他的 cell 连通。
● 两个 cell 之间的连通一定是双向的。即 cell(0,0) 和 cell(1,0) 连通等价于 cell(1,0) 和cell(0,0) 的连通。
要求1:将迷宫渲染为字符串
现在我们希望你书写程序,将给定迷宫的 道路网格 ,渲染为字符串输出。例如,其使用方式如下(伪代码,仅做演示,实际实现时请应用实际语言的编程风格)
Maze maze = MazeFactory.Create(command);
String mazeText = maze.Render();
其中 command 是一个字符串。它的定义如下:
● 第一行是迷宫道路网格的尺寸。例如 3 x 3 的迷宫为3 3 ,而 5 x 4 的迷宫为5 4。
● 第二行是迷宫道路网格的连通性定义。如果cell(0,1)和cell(0,2)是连通的,则表示为:
0,1 0,2 ,多个连通以分号 ; 隔开。
例如,如果给定输入:
3 3
0,1 0,2;0,0 1,0;0,1 1,1;0,2 1,2;1,0 1,1;1,1 1,2;1,1 2,1;1,2 2,2;2,0 2,1
则输出字符串为(如果当前 渲染网格 为墙壁,则输出 [W] 如果为道路则输出 [R]):

要求2:检查输入的有效性
在处理输入的时候需要检查输入的有效性。需要检查的有效性包括如下的几个方面:
● 无效的数字:输入的字符串无法正确的转换为数字。此时,该函数的输出为字符串 ”Invalidnumber format . ”
● 数字超出预定范围:数字超出了允许的范围,例如为负数等。此时,该函数的输出为字符串”Number out of range . ”
● 格式错误:输入命令的格式不符合约定。此时,该函数的输出为字符串 ”Incorrect command format . ”
● 连通性错误:如果两个网格无法连通,则属于这种错误。此时,该函数的输出为字符串 ”Maze format error.”
当多个问题同时出现时,报告其中一个错误即可。

2.代码

题目不难,文档倒是要花功夫写,直接贴代码吧:

'''
===========================================@author:  jiaxin@time:    2018/8/9 0009   10:00
===========================================
'''import numpy as npdef draw_maze(row, col, road):''':param row: 道路网格的行:param col: 道路网格的列:param road: cell之间的连通关系:return final_maze: 生成的迷宫'''render_row = 2 * row + 1render_col = 2 * col + 1final_maze = []render_num = np.zeros((2 * row + 1, 2 * col + 1))for i in range(1, render_row, 2):for j in range(1, render_col, 2):render_num[i][j] = 1for i in road:if i[0] == i[2]:render_num[i[0] * 2 + 1, min(i[1], i[3]) * 2 + 1:max(i[1], i[3]) * 2 + 2] = 1elif i[1] == i[3]:render_num[min(i[0], i[2]) * 2 + 1:max(i[0], i[2]) * 2 + 2, i[1] * 2 + 1] = 1render_alpha = [['[W]'] * (2 * col + 1) for _ in range(2 * row + 1)]for i, coor_row in enumerate(render_num):for j, single_coor in enumerate(coor_row):if single_coor:render_alpha[i][j] = '[R]'for i in render_alpha:final_maze.append(' '.join(i))return final_mazedef check():# 使用try_except语句,若道路网格的尺寸输入错误,如不是数字,不是两个数字,或是由其它符号分隔开的,则返回'Invalid number format.'try:print('请输入迷宫道路网格的尺寸:')row, col = [int(i) for i in input().split()]except:return 'Invalid number format.'try:# source_road为用户输入的:迷宫道路网格的连通性定义,如果输入中包含除正确格式以外的格式,如坐标不是数字,则返回'Invalid number format.'print('请输入迷宫道路网格的连通性定义:')source_road = input()str_road = []coor = []alpha = []for i in source_road.split(';'):str_road.append(i.split())[coor.append(int(kk)) for j in i.split() for kk in j.split(',') if kk.lstrip('-').isdigit()][alpha.append(True) for j in i.split() for kk in j.split(',') if kk.isalpha()]if True in alpha:return 'Invalid number format.'except:return 'Invalid number format.'# 连通域的每个小部分都是4个坐标,如果有多余的坐标,证明没有输入完全,则返回'Incorrect command format.'# 而同时检测coor和str_road,是为了防止像这类有多个分号的情况,如:0,1 0,2;0,0 ;1,0;if len(coor) % 4 != 0 or len(coor) // 4 != len(str_road):return 'Incorrect command format.'# 检测数字的范围,范围为0~1e6,并且连通cell的横纵坐标必须小于道路网格的行列数if 0 < row < 1e6 and 0 < col < 1e6 and max(coor) < row and max(coor) < col and 0 <= min(coor) and 0 <= min(coor):passelse:return 'Number out of range.'road = [coor[4 * i:4 * i + 4] for i in range(len(coor) // 4)]# 检测连通是否正确,只能够直接与相邻正南、正北、正东、正西的cell连通,其他的位置都不能连接,即两个cell的横纵坐标至少有一者是相等的for i in road:if i[0] == i[2] or i[1] == i[3]:passelse:return 'Maze format error.'print("是否使用机器人?如果使用请输入指令,不输入则输入回车即可")robot = input()robot_coor = Nonetry:robot = robot.split()if len(robot) == 1:robot_coor = robot[0].split(',')else:robot_coor = [int(i) for i in robot[0].split(',')]robot_coor.append(robot[1])except:passreturn (row, col, road, robot_coor)if __name__ == "__main__":user_input = check()if isinstance(user_input, tuple):row, col, road = user_inputmaze = draw_maze(row, col, road)for i in maze:print(i)else:print(user_input)

ThoughtWorks 2019届校招算法、软开迷宫(maze)生成题目相关推荐

  1. 滴滴23届校招薪资正式开奖!算法岗最高 55w

    大家好!我是韩老师. 根据"校招巴士"整理的信息,滴滴2023届校招薪资最近正式出炉!据OfferShow小程序以及网友们的爆料,滴滴今年给不同岗位的同学开出的薪资具体如下: 算法 ...

  2. 如何看待 2020 届校招算法岗「爆炸」的情况?

    编辑:忆臻 https://www.zhihu.com/question/342267611 本文仅作为学术分享,如果侵权,会删文处理 如何看待 2020 届校招算法岗「爆炸」的情况? 作者:Ted ...

  3. 如何看待 2020 届校招算法岗「爆炸」的情况?英雄所见略同

    来自:计算机视觉联盟公众号 转载 :知乎问题 如何看待 2020 届校招算法岗「爆炸」的情况? 链接:https://www.zhihu.com/question/342267611 本文仅作为学术交 ...

  4. 2019届校招实习生惨痛经历

    2019届校招实习生小白的挂经 一直以来都有做开发的想法,个人情况就是了解的东西挺多,但不是特别深入,也没有什么项目经验.面了6家互联网公司,全部凉凉.究其原因,首先是项目经验不足,加上基础(例如计算 ...

  5. 万字长文 | 2023届校招算法岗知识总结

    大家好,我是蘑菇先生. 为今年校招的同学准备了一份笔面试经验大礼包.主要结合本人当年校招时候的经验"2021届校招算法岗知识点总结"以及近两年工作学习过程中的感悟收获.主要面向搜推 ...

  6. 2020届校招算法岗面经汇总

    作者:我是一个小和尚~ 链接:https://www.nowcoder.com/discuss/205497 来源:牛客网 [百度]百度知识图谱nlp日常实习一面凉 https://www.nowco ...

  7. 百度23届校招薪资正式开奖!总包最高 55w

    大家好!我是韩老师. 首先祝大家新年快乐,身体健康! 根据"校招巴士"整理的信息,百度23届校招薪资最近正式出炉了!据OfferShow小程序以及网友们的爆料,百度今年给不同岗位的 ...

  8. 罗浩.ZJU | 如何看待 2020 届校招算法岗「爆炸」的情况?

    点击上方"Datawhale",选择"星标"公众号 第一时间获取价值内容 作为20届CV方向校招的一员,我也经历了今年的校招,也在关心着师弟师妹们的秋招情况,的 ...

  9. 如何看待 2020 届校招算法岗供远大于求的情况?

    编辑:Charlotte https://www.zhihu.com/question/344122516 本文仅作为学术分享,如果侵权,会删文处理 作者:周国睿链接: https://www.zhi ...

  10. 2023届校招算法岗知识超全总结

    又是一年「金三银四」,在此为今年校招的同学准备了一份笔面试经验大礼包. 去年我发过一篇 论机械狗如何硬卷算法岗,主要是机械转互联网的经验分享. 本文主要面向搜推广nlp岗位的同学. 总体而言,个人认为 ...

最新文章

  1. VMware workstation虚拟机不能联网解决方法
  2. IDC:以太网交换机市场增长2%
  3. 想用一张报表满足多人需求?只需这3招,轻松实现0到100分新突破
  4. 软件测试个人心得总结
  5. docker中安装了RabbitMQ后无法访问其Web管理页面
  6. 配置quick-cocos2d-x-develop OpenGL version too old
  7. 快速安装制作黑苹果macOS High Sierr系统
  8. 苹果电脑快速重装Windows系统
  9. Android 打开应用商店评分
  10. 未来可期的TypeScript
  11. 【JDK下载与安装教程】
  12. 【NOIP2015】洛谷2668 斗地主
  13. 时间序列分析——基于R | 第2章 时间序列的预处理习题代码
  14. c++ opencv 将视频转化成字符串
  15. 如何下载因特尔显卡的最新驱动
  16. 【Proteus】Arduino UNO + DS1307+LCD1602时间显示
  17. C 左移 和右移 计算
  18. java-php-python-ssm美容院信息管理系统计算机毕业设计
  19. eclipse svn org.tigris.subversion.javahl.ClientException: RA layer request failed
  20. Incorrect date value: ” for column ‘Birthday’ at row 1

热门文章

  1. oracle 查询去年同期,Oracle求近7日累計值和去年同期值
  2. HDMI/DVI分配器芯片
  3. ionic加载html5,ionic 加载动画
  4. python爬取B站弹幕
  5. 大规模定制的实现方法
  6. U盘/移动硬盘 有写保护怎么解除【未解决】
  7. 小白入门必学——python循环语句
  8. Python的猜平均数一半游戏
  9. Linux系统的关机重启命令
  10. 开天辟地--达特茅斯会议