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[