生成迷宫并求解迷宫算法
上周,一位同事向我的团队指出了在线开发人员招聘的挑战。 当我发现它很有趣并且不需要透露自己的电子邮件时,我决定尝试一下,只是检查是否可以发送。
问题很简单,但并不容易:考虑一个有限大小的矩形迷宫。 必须在板上找到特定的单元-出口,从起点开始。 一个人有2个移动选项:一次在4个基点之一中移动一个牢房,或跳到任何以前访问过的牢房。 当然,如果没有障碍,那将不是迷宫:每个单元都提供有关4个相邻单元的信息,无论是未访问,被墙阻挡还是已经被探索。 最后一个约束是:每个迷宫都存活有限的时间。 如果在超时后仍未到达末端单元,则为失败。
在阅读了Wikipedia上有关迷宫求解算法的专门页面之后,我决定实现wall follower 。 这非常简单,基本上,您总是遵循左(或右)墙。
我的第一个实现就是这样做的。 这种解决方案的问题是,一旦到达死角,即一个单元有一个被访问的方向而所有其他方向都被阻塞,则一个单元必须逐个单元地移回去。 由于超时,此实现始终失败。
我第二次尝试变得更聪明。 我不想跳一个单元,而是考虑跳到最后一个单元,该单元提供了至少两个未探索的相邻单元之间的选择。 为了做到这一点,当我将一个单元格移入一个单元格时,将它们放在堆栈上。 当陷入死胡同时,我只需要弹出堆栈中的顶部单元格,然后一步就跳到它上面。 再次查询并更新,因为少了一个方向被认为是未开发的,此过程继续进行。
它碰巧是一个很好的解决方案:我成功了2次(也失败了几次),同时获得了秘密消息和您可以应用的页面URL。 太糟糕了,它在加拿大,但是很有趣。 为了使其更加有趣,我在Kotlin中使用Fuel库进行了开发。
生成迷宫并求解迷宫算法