C++ bfs 的状态表示(六十二)【第九篇】

今天我们来学习一下bfs的复杂状态表示

1.bfs状态表示

无论是深度优先搜索还是广度优先搜索,搜索的过程均会建立一棵 搜索树,搜索树上的每一个结点都是一个 状态,而搜索的过程又可以看作是 状态的转移。

对于 BFS,搜索过程中产生的状态一般会使用一个结构体存储。例如下方代码中,使用结构体表示到达 x 的最短距离为 dis 的状态。

struct node {
    int x, dis;
};

这节课我们会学习一些复杂状态表示方法。

我们之前已经接触过了迷宫问题,也利用 DFS、BFS 求解过迷宫问题的最短路。

这里我们接着研究更复杂一点的迷宫问题——带钥匙的迷宫。

带钥匙的迷宫就是在迷宫中除了起点、终点、障碍外还有钥匙,你需要从起点出发,取得钥匙,到达终点。我们常常求解的是带钥匙迷宫的最短路,也就是从起点去拿钥匙再到终点最少需要走多少步。

图片

同学们可以思考一下,这个问题可以如何解决呢?

相比于普通的迷宫问题,我们就是多了钥匙这个因素,也就是说对于在同一个点的情况,现在手上有没有钥匙,对于后边是不一样的。

那我们就可以在表示状态的时候相比之前增加一维,表示现在有没有钥匙,此时的状态为 (x,y,status) ,表示目前我们在 (x,y) 这个点,目前有没有钥匙。其中 status 为 0 表示没有钥匙,为 
1 表示有钥匙。

设起点为 (sx,sy) 那么初始状态就是 
(sx,sy,0) ,每一次往一个方向走的时候,看这一位走到后是不是钥匙,如果是那 
status 就变成 
1 ,否则 
status 就保持原样。

注意此时 
vis 数组或者 
dis 数组都需要是三维的,第三维就是 status 。

  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值