CodeForces

来源:互联网 发布:中华养生 源码 编辑:程序博客网 时间:2024/05/18 02:12



点击打开链接


题意:

给你个起点,终点。

在无限大的地图上,跑,问你能不能从起点跑到终点。


题解:

地图太大。无法用数组。

那么怎么办呢, 用stl  。

pair型的队列。把步数直接存在标记里面。

标记用map<pair<int,int>,int>.  一个点一个点的标记。

剩下的就是简单广搜。 

stl真是强大。

各种嵌套着用。

#include<iostream>#include<string>#include<stdio.h>#include<string.h>#include<map>#include<queue>#include<math.h>#include<algorithm>using namespace std;int sx,sy,ex,ey,n,r,a,b;int main(){    pair<int,int>p,t;    map<pair<int,int>,int>m;    queue<pair<int,int> >que;    scanf("%d %d %d %d",&sx,&sy,&ex,&ey);    scanf("%d",&n);    while(n--){        scanf("%d %d %d",&r,&a,&b);        for(int i=a;i<=b;++i){            p.first=r,p.second=i;            m[p]=-1;        }    }    p.first=sx,p.second=sy;    que.push(p);    m[p]=1;    while(!que.empty()){        p=que.front();        que.pop();        for(int i=-1;i<=1;++i){            for(int j=-1;j<=1;++j){                if(i==j&&i==0) continue;                t.first=p.first+i,t.second=p.second+j;                if(m[t]==-1){                    m[t]=m[p]+1;                    que.push(t);                }            }        }    }    p.first=ex,p.second=ey;    if(m[p]>0) m[p]--;    printf("%d\n",m[p]);    return 0;}

0 0