今天我们来学习一下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 。