这道题题意就是给你国王的当前坐标和目的地坐标,找最短路,如果单看题面就是一个模板BFS,但是一看数据1e9很吓人。
之前头铁了,一直想怎么标记区间,结构体 向量嵌套map都想完了 结果还是无法处理一个问题 比如给你第一个样例给你
一个 5 3 8 又给你 5 2 5 第二个输入会覆盖第一个。
如果没仔细读这句话 It is guaranteed that the total length of all given segments doesn't exceed 10^5.这道题几乎没法做。
真坑啊!!!就是保证标记的区间总长度不超过1e5直接暴力标记就好了。用2个map嵌套可以模拟成一行二维数组
水题!!!
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn=2e5+100;
const int INF=699999999;
const int mod=1e9;
const int N=1e6+10;
ll gcd(ll a,ll b)
{
return (b==0)?a:gcd(b,a%b);
}
ll lcm(ll a,ll b)
{
return a*b /gcd(a,b);
}
bool cmp(ll a,ll b)
{
return a>b;
}
int sx,sy,ex,ey,n;
struct node
{
int x;
int y;
};
//map<int,node>G;
map<int,map<int,int> >v;
bool check(int h,int l)
{
if(h>0&&h<=mod&&l>=0&&l<=mod&&v[h][l]==-1)
return true;
return false;
}
int BFS()
{
int dx[8]= {0,0,1,-1,1,-1,-1,1};
int dy[8]= {1,-1,1,-1,-1,1,0,0};
queue<node>q;
node now,nxt;
now.x=sx,now.y=sy;
q.push(now);
v[sx][sy]=0;
while(!q.empty())
{
now=q.front();
q.pop();
for(int i=0; i<8; i++)
{
nxt.x=now.x+dx[i];
nxt.y=now.y+dy[i];
if(check(nxt.x,nxt.y))
{
v[nxt.x][nxt.y]=v[now.x][now.y]+1;
if(nxt.x==ex&& nxt.y==ey)
return v[nxt.x][nxt.y];
q.push(nxt);
}
}
}
return -1;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int h,l,r;
cin>>sx>>sy>>ex>>ey;
cin>>n;
for(int i=0; i<n; i++)
{
cin>>h>>l>>r;
for(int i=l; i<=r; i++)
{
v[h][i]=-1;
}
}
cout<<BFS()<<endl;
return 0;
}