CSP 201912-2 回收站选址

通过无人机航拍我们已经知晓了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;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值