Flood Fill核心思想:对每次加进来的格子判断是否能够加入新的格子
可以在线性时间复杂度内,找到某个点所在的连通块。宽搜是不会爆栈的,深搜可能会爆栈。找连通块。在算法题里面一般栈空间为1M,100000层可能就会爆。
例题 :池塘计数
学到一个新写法:判断八联通用两重循环
for(int i = t.x-1;i<=t.x+1;i++)
{
for(int j=t.y-1;j<=t.y+1;j++)
{
if(i==t.x&&j==t.y) continue;
balabala
}
}
例题2:城堡问题
这里输入采用的数字,在判断的时候不用先把图恢复,直接用 g[t.x][t.y] >> 1 & 1 的值来判断是否有墙,有墙值为1.
例题3.山谷和山峰
本题在判断的时候往外扩展时需要判断与其相邻的点的情况
最短路模型:宽搜第一次搜到的时候,就是这个点到起点最短的路径。
例题1:迷宫问题
这里需要保存路径,可以把st数组修改一下,存储其父节点。还有一个技巧是从终点开始搜索,搜到起点,这样的话输出就是正向了。
例题2:武士风度的牛
本题只要注意是走日就行了,跟走迷宫类似
例题3:抓住那头牛
为什么图里面边权都是1的时候可以用bfs来求?
可以看成是一个特殊的迪杰斯特拉算法,所有边权都是1,队列就是优先队列,对头是当前最小值,由于迪杰斯特拉正确,那么这样也是正确的。