我正在参加「掘金·启航计划」点击查看活动详情的第二天
今天我们来看一道leetcode上面的困难题,也是一道逻辑较复杂的BFS类题目🤔🤔🤔。
题目链接在这里864. 获取所有钥匙的最短路径
题意
题目给了我们一个二维网格(就像很多其他BFS路径类题目一样🤣),有一个小人在其中移动
网格中有5种字符:
- @表示移动的起点
- .表示一个空位置
- #表示一堵墙
- a-f表示6把钥匙
- A-F表示钥匙对应可以打开的锁
然后,小人会从@点开始移动,不能穿过墙也不能走出网格,遇到钥匙可以拾起钥匙,遇到锁的时候,只有当前有对应的钥匙才可以通过,题目让我们求获得所有钥匙的最小移动次数。
思路
- 因为只有当前有a钥匙,在遇到A锁是才可以通过,才有可能拿到更多钥匙,所以在移动个过程中,我们需要记录当前拿到了那些钥匙
- 因为钥匙只有6把,所以我们可以使用6个二进制位来表示,这样,我们在后面遇到锁的时候,可以使用且运算来判断当前是否有打开锁的钥匙。
- 然后,为了防止走重复的路线,我们还需要记录那些位置走过了,同时附带钥匙的状态,这意味着如果拿着同样的钥匙走过同一个位置两次是不被允许的,但是拿着不同的钥匙是可以走过同一个位置两次的。
- 这样,我们就完成了BFS中去重、状态分析两个过程,然后,我们就可以从@点开始移动,进行BFS搜索
- 搜索过程中,我们需要记录除了位置之外的 钥匙的状态和步数
- 遇到钥匙时,我们除了标记当前钥匙状态下当前位置走过了,还需要把携带位置钥匙之后,使用或运算计算出来的新状态下当前位置也走过了。
- 遇到锁时,需要将当前的状态和 锁对应的钥匙的二进制位进行 且运算,如果结果为1,则说明有当前锁对应的钥匙,否则,则不能通过。
当前,具体代码实现过程中,还有一些细节需要注意,毕竟这道题的代码量包含在它的难度中😢
代码实现
结束语
如果有更好的分析思路,欢迎大家在评论区发表看法!⛄