求助
查看原帖
求助
320815
STL_Lover楼主2020/7/2 09:44

44pts WA

#include<cstdio>
#include<vector>
#include<map>
#include<deque>

using namespace std;

const int maxn=500010;
typedef pair<int,int> P;
P rock[maxn];

map<P,int>have;
map<int,bool>searched;

vector<int>line[maxn];

vector<int>start;
int n,t;
inline void init()
{
    scanf("%d%d",&n,&t);
    for(register int i=1;i<=n;i++)
    {
        scanf("%d%d",&rock[i].first,&rock[i].second);
        have[rock[i]]=i;
    }
    for(register int i=1;i<=n;i++)
    {
        for(int j=rock[i].first-2;j<=rock[i].first+2;j++)
        for(int k=rock[i].second-2;k<=rock[i].second+2;k++)
        {
            P tmp;tmp.first=j;tmp.second=k;
            if(have.count(tmp)) line[i].push_back(have[tmp]);
        }
    }
    for(register int i=-2;i<=2;i++)
    for(register int j=-2;j<=2;j++)
    {
        P tmp;tmp.first=i;tmp.second=j;
        if(have.count(tmp)) start.push_back(have[tmp]);
    }
}

inline void BFS()
{
    deque<int>bfs;
    int len=start.size();
    for(register int i=0;i<len;i++)
    {
        bfs.push_back(start[i]);
        searched[start[i]]=true;
    }
    int size=1;
    while(!bfs.empty())
    {
        size++;
        int tmp=bfs.front();
        bfs.pop_front();
        int tlen=line[tmp].size();
        for(int i=0;i<tlen;i++)
        {
            if(searched[line[tmp][i]]) continue;
            bfs.push_back(line[tmp][i]);
            searched[line[tmp][i]]=true;
            if(rock[line[tmp][i]].second==t)
            {
                printf("%d\n",size-1);
                return;
            }
        }
    }
    printf("%d\n",-1);
}

int main()
{
    init();
    BFS();
}
2020/7/2 09:44
加载中...