据说这个是谷歌 Google 的第一轮面试题. 一般这种题目就是: 设计一个迷宫算法 (Design a Maze). 面试中应该先问清楚需求 (Ask Clarifying Questions): 迷宫需要有几条出路? (假定至少1条), 多大的迷宫? 多复杂的迷宫等等.
最容易想到的就是随机生成1和0的地图, 其中1是墙, 0是空路, 不过这种方法生成随机的效率实在是太低, 你可以跑了半天也无法生成一个有效的迷宫, 我们假定有效的迷宫是至少含一条路径.
1 2 3 4 5 | def maze(width, height): m = None while not check(m): m = generate_random_matrix(width, height) return m |
def maze(width, height): m = None while not check(m): m = generate_random_matrix(width, height) return m
当迷宫无效的时候我们还可以随机的把一些墙变成空格, 这样在进行若干次后肯定有路径, 不过这样的迷宫不可控, 因为很有可能生成的迷宫很稀疏 (Sparse), 一点也不像迷宫.
1 2 3 4 5 | def maze(width, height): m = generate_random_matrix(width, height) while not check(m): m = remove_a_random_wall(m) return m |
def maze(width, height): m = generate_random_matrix(width, height) while not check(m): m = remove_a_random_wall(m) return m
效率比较高的一种算法是: 先随机生成一条或者几条有效路径, 然后生成若干条干扰路径, 然后再把剩下的填成墙.
在生成路径的时候我们可以从顶部(然后可以旋转或者水平垂直镜像生成其它可能)随机往下左或者右三个方向走, 并且我们需要记录走过的格子(哈希集合), 这样就不会重复走. 随机走然后直到走出界. 生成干扰路径只需要最后面随机在路么中间加堵墙(或者多个).
当然需要避免在生成干扰路径的时候加的墙也同时把我们需要的有效路径给堵死了, 只需要避免在岔口填墙就可以了.
以下是 OpenAI/ChatGPT 给出的解决方案.
- 创建一个迷宫: 创建一个二维数组, 用来表示迷宫的每个位置, 0表示可以通过, 1表示不可以通过.
- 随机生成迷宫: 使用随机数来生成迷宫, 将一定比例的位置设置为1, 其余位置设置为0.
- 添加起点和终点: 将起点和终点的位置设置为0, 以便可以通过.
- 添加障碍物: 在迷宫中添加一些障碍物, 使得起点和终点之间的路径更加复杂.
- 添加传送门: 在迷宫中添加一些传送门, 使得玩家可以从一个位置跳转到另一个位置, 从而更加有趣.
英文: Teaching Kids Programming – How to Design a Random Maze? Random Maze Generation Algorithm
面试经历
- 写了十几年代码, 谷歌/Google认为我还不够Senior
- Jane Street第一轮一小时面试体验卡(伦敦软件工程师)
- Meta/Facebook四次面试经历
- 三次冲击谷歌软件工程师: 我的面试起伏录 (谷歌面试是不是一生只有三次机会?)
- 记两次伦敦抖音面试经历(Tiktok)
- 我的面试谷哥GOOGLE伦敦SRE的经验和教训
- 记Facebook的第一轮技术面试(伦敦脸书)
- 记微软Principal SE的第一轮面试
- 我的AMAZON面试经历与经验之谈(亚麻伦敦面经)
- 离伦敦脸书最近的一次 - 记FACEBOOK伦敦终面经历
面试题
- 软件工程师面试: TCP/IP协议是什么?
- 软件工程师经典面试题: 当你在浏览器的地址栏敲入google.com并按回车后发生了什么?
- 谷歌面试题: 迷宫随机生成算法
- 软件工程师数据库面试技巧之 SQL中的第二名记录
- 软件工程师面试技巧之 动态规化 - 整数拆分
- 软件工程师面试技巧之 如何检查数独的有效性
- 去年 Google 的面试题 - 打印消息
- 软件工程师面试技巧之 使用哈希表降复杂度
- 微软面试题: 三角形的面积是多少?
- 英国 IT公司 电话面试的一些技巧 (程序员)
- C/C++ 中的内存管理器(堆与栈)
- C++的 map 当键(Key)不存在的时候会发生什么?
- 随机数独游戏的算法设计 (Sudoku)
- 经典二叉树的镜像的递归算法
- 谷歌的扔鸡蛋问题
- 面经: Python 的 List 和 Dictionary 有啥区别?
- 逻辑测试系列 - 一种只有4种语句的编程语言 - (1)
- 逻辑测试系列之二 - DECR
- 逻辑测试系列之三 - SUBT
面试技巧
面试其它
- 产品设计和系统设计面的区别(Product Design vs System Design)
- 45 分钟模拟面试(编程、系统设计)+职业发展建议
- 英国和美国IT公司面试的主要区别
- 拒了甲骨文(Oracle)的 Offer
GD Star Rating
loading...
本文一共 635 个汉字, 你数一下对不对.loading...
上一篇: 通过在Wirex X 账户上质押代币(USDT 等)赚取被动收入
下一篇: 来自驻英中国大使馆的春节礼物-还是当中国人比较好
扫描二维码,分享本文到微信朋友圈
