BFS:迷宫问题

题目

BFS:迷宫问题_第1张图片

这是一个基础广搜。先将起始位置入队列

每次从队列拿出一个元素,扩展其相邻的4个元素入队列(要判重),(开一个二维数组,可以让里面的元素跟他对应。)
直到队头元素为终点为止。队列里的元素记录了指向父节点(上一步)的指针

队列元素:
struct{
int r,c;
int f;//父节点在队列中的下标
};

在这套题目里面不能用STL的queue或者deque,要自己写(因为一个元素从队头删除,则再也找不到了,而我们这里要记录从起点到终点路径上面的每一个节点,让他进行输出)。用一维数组实现,维护一个队头指针和队尾指针。所有进入到队列的元素,都可以在队列里面不会删除,我们还会找到他

从队列删除一个元素,实际上就是队头元素往右移,相当于删除了,但上一个还在队列里面没有动
BFS:迷宫问题_第2张图片
因为题目要记录路径,每一次扩展出来之后,要让进队尾,还要写一个f,指向父节点的指针
f存放是修改之前的下标
BFS:迷宫问题_第3张图片
起点和终点相同,即找到了,之后找到上一个父节点,之后再找出路
BFS:迷宫问题_第4张图片

迷宫问题的变形–鸣人和佐助

BFS:迷宫问题_第5张图片

这个题目的状态是什么?
上一个题目就是(x,y)一个坐标
而这里的状态就是一个三维数组,(x,y,k),鸣人所在的行,列,和查克拉数量

如果队头节点扩展出来的节点是有大蛇手下的节点,则其k值比队头的k值要比队头的k要剪掉1.如果队头节点的查克拉数量为0,则不能扩展出有大蛇手下的节点。

求钥匙的鸣人

BFS:迷宫问题_第6张图片
状态:
(r,c,keys):鸣人的行,列,已经拥有的钥匙种数
目前状态(x,y,k)(x,y)是佐助呆的地方
如果队头节点扩展出来的节点上面有不曾拥有的某种钥匙,则该节点的keys比队头节点的keys要加1

你可能感兴趣的:(算法)