一开始从标记点开始bfs ole 了,然后从空点开始就过了
#include<iostream>
#include<queue>
#include<utility>
#include<map>
using namespace std;
typedef pair<int,int>pii;
map<pii,pii>ans;
map<pii,int>id;
map<pii,pii>root;
queue<pii> m;
pii p[200001];
int px[4]= {1,0,-1,0};
int py[4]= {0,1,0,-1};
int main() {
int n,i,j,k;
cin>>n;
for(i=0; i<n; i++)cin>>p[i].first>>p[i].second,id[p[i]]=1;
for(i=0; i<n; i++) {
for(j=0; j<4; j++) {
int dx=px[j]+p[i].first;
int dy=py[j]+p[i].second;
pii t=make_pair(dx,dy);
if(!id.count(t))//将空点存入队列
{
root[t]=t;
m.push(t);
}
}
}
while(ans.size()<n)
{
for(i=0;i<4;i++)
{
int dx=px[i]+m.front().first;
int dy=py[i]+m.front().second;
pii o=make_pair(dx,dy);
if(!ans.count(o)&&id.count(o))//第一次找到的答案为最佳
{
root[o]=root[m.front()];
ans[o]=root[o];
m.push(o);
}
}
m.pop();
}
for(i=0;i<n;i++)printf("%d %d\n",ans[p[i]].first,ans[p[i]].second);
}