[路飞]_864. 获取所有钥匙的最短路径

542 阅读2分钟

我正在参加「掘金·启航计划」点击查看活动详情的第二天

今天我们来看一道leetcode上面的困难题,也是一道逻辑较复杂的BFS类题目🤔🤔🤔。

题目链接在这里864. 获取所有钥匙的最短路径

题意

image.png

image.png

题目给了我们一个二维网格(就像很多其他BFS路径类题目一样🤣),有一个小人在其中移动

网格中有5种字符:

  • @表示移动的起点
  • .表示一个空位置
  • #表示一堵墙
  • a-f表示6把钥匙
  • A-F表示钥匙对应可以打开的锁

然后,小人会从@点开始移动,不能穿过墙也不能走出网格,遇到钥匙可以拾起钥匙,遇到锁的时候,只有当前有对应的钥匙才可以通过,题目让我们求获得所有钥匙的最小移动次数。

思路

  • 因为只有当前有a钥匙,在遇到A锁是才可以通过,才有可能拿到更多钥匙,所以在移动个过程中,我们需要记录当前拿到了那些钥匙
  • 因为钥匙只有6把,所以我们可以使用6个二进制位来表示,这样,我们在后面遇到锁的时候,可以使用且运算来判断当前是否有打开锁的钥匙。
  • 然后,为了防止走重复的路线,我们还需要记录那些位置走过了,同时附带钥匙的状态,这意味着如果拿着同样的钥匙走过同一个位置两次是不被允许的,但是拿着不同的钥匙是可以走过同一个位置两次的
  • 这样,我们就完成了BFS中去重、状态分析两个过程,然后,我们就可以从@点开始移动,进行BFS搜索
    • 搜索过程中,我们需要记录除了位置之外的 钥匙的状态和步数
    • 遇到钥匙时,我们除了标记当前钥匙状态下当前位置走过了,还需要把携带位置钥匙之后,使用或运算计算出来的新状态下当前位置也走过了
    • 遇到锁时,需要将当前的状态和 锁对应的钥匙的二进制位进行 且运算,如果结果为1,则说明有当前锁对应的钥匙,否则,则不能通过。

当前,具体代码实现过程中,还有一些细节需要注意,毕竟这道题的代码量包含在它的难度中😢

代码实现

image.png

结束语

如果有更好的分析思路,欢迎大家在评论区发表看法!⛄