目录
题意:
给你一些点,找到离这些每个点的一个最近的点。
(而且要一一对应,,)
思路:
样例一:
边缘点的邻点就是最近的,对里面的点来说也是。
对边缘的点bfs搜里面的点即可。处理对应比较麻烦,需多开空间。
(题目有给边界哦;1e6开不了二维,只能用pair压缩了(类似邻接表))
参考代码:
我是用map记录给定点的初始下标,方便最后给答案。
barr就是"visit"数组,是否bfs过。
bfs带的第二个pair就是边缘点坐标。
#define ll long long
#define endl "\n"
//#define int long long
#define PII pair<int,int>
const ll inf = 1e9;
const ll MOD = 0x77777777737;
const int maxn = 1e6;
int fx[4] = {1,-1,0,0};
int fy[4] = {0,0,1,-1};
void solve()
{
int n;
cin >> n;
map<PII,int>arr;
vector<int>barr(n);
int a, b;
for (int i = 0; i < n; i++)
{
cin >> a >> b;
arr[{ a,b }] = i;
}
vector<PII>aim;
vector<PII>ans(n);
for (auto x:arr)
{
for (int j = 0; j < 4; j++)
{
a = x.first.first + fx[j], b = x.first.second + fy[j];
if (a >= 0 && a <= maxn
&& b >= 0 && b <= maxn && !arr.count({a,b}))
{
aim.push_back({ a,b });
break;
}
}
}
//向内bfs
queue<pair<PII,PII>>bfs;
for (int i = 0; i < aim.size(); i++)
{
bfs.push({ aim[i],aim[i] });
}
while (bfs.size())
{
int c = bfs.front().second.first ,d= bfs.front().second.second;
for (int j = 0; j < 4; j++)
{
a = bfs.front().first.first + fx[j], b = bfs.front().first.second + fy[j];
if (a >= 0 && a <= maxn
&& b >= 0 && b <= maxn && arr.count({ a,b }))
{
if (barr[arr[{a, b}]] == 0)
{
barr[arr[{a, b}]] = 1;
bfs.push({ {a,b} ,{c,d} });
ans[arr[{a, b}]] = { c,d };
}
}
}
bfs.pop();
}
for (auto x : ans)
{
cout << x.first << " " << x.second << endl;
}
}
signed main()
{
ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
int t = 1;
//cin >> t;
while (t--)
{
solve();
}
return 0;
}