Vijos 1468 渡河

本文介绍了一道关于地图搜索的题目,探讨如何从陆地到达河流并最少使用竹筏。最初尝试使用BFS+并查集的方法,虽然逻辑正确但效率低下导致超时。改进策略是采用从外层开始的分层Floodfill,通过DFS进行染色,并用BFS进行层次判断。最终解决方案为((最外层层数 - 1) / 2),确保了较高的效率。
摘要由CSDN通过智能技术生成

题目连接:https://vijos.org/p/1468

本题是一道非常好的搜索题。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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值