神一般的STL题,给跪了!!
题意求一个点是否能到另一个点,到另一个点的最小步数
因为给的不是连续的坐标,而是一段一段的坐标,又因为坐标范围比较大(1-10^9).
觉得要用离散的方法,弱菜不会,看大神们都用STL,看了下,实在太神了,膜拜之!!
View Code
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <vector> #include <queue> #include <set> #define MAXN 100050 using namespace std; int x0,y0,x1,y1; int n; typedef pair<int,int> PII; set<PII> s; queue < pair<PII,int> > q; int stepx[10]={0,0,-1,1,-1,1,-1,1}; int stepy[10]={-1,1,0,0,-1,-1,1,1}; int main() { while(~scanf("%d%d%d%d",&x0,&y0,&x1,&y1)){ scanf("%d",&n); int r,a,b; for(int i=0;i<n;i++){ scanf("%d%d%d",&r,&a,&b); for(int j=a;j<=b;j++){ s.insert(PII(r,j)); } } int step,xx,yy; q.push(make_pair(PII(x0,y0), 0)); while(!q.empty()){ int x=q.front().first.first; int y=q.front().first.second; step=q.front().second+1; q.pop(); for(int i=0;i<8;i++){ xx=x+stepx[i]; yy=y+stepy[i]; if(s.find(PII(xx,yy))==s.end())continue; s.erase(PII(xx,yy)); if(xx==x1&&yy==y1){ printf("%d\n",step); return 0; } q.push(make_pair(PII(xx,yy),step)); } } printf("-1\n"); } return 0; }