本题是一道非常好的搜索题。DFS+BFS;
给一张地图:0代表陆地,1代表河流,从陆地到河流需要做竹筏,问做少做几次竹筏能从这块区域出去。
第一次看到这道题,我用了最简单的BFS+并查集。并查集用来处理多次查询的情况,如果相某个点已经被计算过,那么,和他联通的点就不用计算了,直接输出结果。但是对于每一次查询,却要用BFS,BFS是复杂度最高的那种,以dist数组最小为止。这种做法会超时。逻辑没有问题。属于一种半在线半离线的状态。
换一种思路:
从最外层开始Floodfill,联通的节点染同一种颜色,然后颜色+1,floodfill下一个联通。这样相当于分层Floodfill,这样相当于从外到内,依次是:河流、陆地、河流、陆地...,最后的结果就是(层数-1)/2。切忌对于本题而言最外层可能不全是0,加一层0包围即可。这样,Floodfill我用DFS来做,对于分层,我用BFS来做。这样逻辑性更好一些。
代码:
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <algorithm>
#include <stack>
#include <queue>
using namespace std;
int ma