2020CCPC(威海) — B Labyrinth(bfs+思维)

该博客讨论了如何使用BFS(广度优先搜索)解决2020年CCPC(威海)比赛中的B.Labyrinth问题。面对n*m矩阵内的k个黑洞,通过预处理黑洞周围点的最短路径,解决了在给定起点和终点间的最短路径查询。关键在于以黑洞为中间点进行BFS预处理,并动态开内存以避免数组过大。
摘要由CSDN通过智能技术生成

B.Labyrinth

题目大意:

给你一个n*m的矩阵,在矩阵内部有k个黑洞(表示不可行走的区域),现在给出q次询问,每次询问给出两个点(x1,y1)和(x2,y2),问从点(x1,y1)到点(x2,y2)的最短路是多少。

思路:

如果每次都从起点和终点-开始考虑bfs寻找最短路的话,那么这样的数据范围肯定会超时的。但是黑洞的范围很小,显然我们应该从黑洞入手考虑。
1.如果矩形区域【x1,x2】X【y1,y2】没有黑洞,那么两点之间的最短距离必为曼哈顿距离。
2.否则一定存在一条最短路,经过黑洞的上下左右四个点之一。那么由于黑洞的数量很少,我们可以以黑洞的上下左右四个点作为中间点。用bfs进行预处理,然后对于每个查询来说就是枚举中间点维护最短距离就好了。

但需要注意的是,如果记录距离时四维数组开满的话肯定会炸,所以我们用new的方法来动态开内存

AC Code

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int inf=1e9;
const int N=2e5+10;
set<pair<int,int>>ans;
map<pair<int,int>,int>mp;
int n,m,k,q;
int *dis[45][4][N];
int dir[4][2]={
   {
   0,-1},{
   0,1},{
   1,0},{
   -1,0}};//黑洞的上下左右四个方向
struct node
{
   
    int x,y;
    int dist;
};
void bfs()
{
   
    for(auto iter=ans.begin();iter!=ans.end();iter++)
    {
   //遍历每个黑洞
        int x=(*iter).first;        //黑洞的坐标
        int y=(*iter).second;
        int idx=mp[
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值