通过无人机航拍我们已经知晓了n处尚待清理的垃圾位置,其中第i(1<=i<=n)处的坐标为(xi,yi),保证所有的坐标均为整数。
我们希望在垃圾集中的地方建立些回收站。具体来说,对于一个位置(x, y)是否适合建立回收站,我们主要考虑以下几点:
(x, y)必须是整数坐标,且该处存在垃圾;上下左右四个邻居位置,即(x, y+1),(x, y-1),(x+1, y)和(x-1, y)处,必须全部存在垃圾;进一步地,我们会对满足上述两个条件的选址进行评分,分数为不大于4的自然数,表示在(x±1,y±1)四个对角位置中有几处存在垃圾。
现在,请你统计一下每种得分的选址个数。
思路
使用set存放垃圾坐标,利用set快速查找循坏判断每隔垃圾点是否适合建立回收站及评分。
在这里插入代码片
#include<iostream>
#include<set>
using namespace std;
struct point{
int x;
int y;
point(int x1,int y1):x(x1),y(y1){}
bool operator < (const point &p) const{//重构运算符
if(x==p.x) return y<p.y;
return x<p.x;
}
};
int main(){
int n;
cin>>n;
set<point> recycle;//存放垃圾点坐标
set<point>::iterator it;
int res[5]={0};
int x,y;
//读入垃圾点坐标并存储
for(int i=0;i<n;i++){
cin>>x>>y;
recycle.insert(point(x,y));
}
//循环判断每个垃圾点是否符合要求
for(it=recycle.begin();it!=recycle.end();it++){
x=(*it).x,y=(*it).y;
if(recycle.find(point(x-1,y))!=recycle.end()&&recycle.find(point(x,y-1))!=recycle.end()&&recycle.find(point(x+1,y))!=recycle.end()&&recycle.find(point(x,y+1))!=recycle.end()){
int ans=0;//统计分数
if(recycle.find(point(x-1,y-1))!=recycle.end()) ans++;
if(recycle.find(point(x-1,y+1))!=recycle.end()) ans++;
if(recycle.find(point(x+1,y-1))!=recycle.end()) ans++;
if(recycle.find(point(x+1,y+1))!=recycle.end()) ans++;
res[ans]++;
}
}
for(int i=0;i<5;i++) cout<<res[i]<<endl;
return 0;
}