跳到主要内容
0%
约 2 分钟

CSP 201912-2回收站选址 C++ 100


题目

【题目背景】 开学了,可是校园里堆积了不少垃圾杂物。热心的同学们纷纷自发前来清理,为学校注入正能量~

【题目描述】 通过无人机航拍我们己经知晓了n处尚待清理的垃圾位置,其中第i(1≤i≤n)处的坐标为(xi,yi),保证所有的坐标均为整数。我们希望在垃圾集中的地方建立些回收站。具体来说,对于一个位置(x,y)是否适合建立回收站,我们主要考虑以下几点: ·(x,y)必须是整数坐标,且该处存在垃圾: ·上下左右四个邻居位置,即(xy+1)、(K,y-1)、(x+1,y)和(x-1,)处,必须全部存在垃圾: ·进一步地,我们会对满足上述两个条件的选址进行评分,分数为不大于4的自然数,表示在(x±1,y±1)四个对角位置中有几处存在垃圾。 现在,请你统计一下每种得分的选址个数。

【输入格式】 从标准输入读入数据。 输入总共有n+1行。 第1行包含一个正整数n,表示己查明的垃圾点个数。 第1+i行(1≤i≤n)包含由一个空格分隔的两个整数:和,表示第i处垃圾的坐标。 保证输入的n个坐标互不相同。

【输出格式】 输出到标准输出。 输出共五行,每行一个整数,依次表示得分为0、1、2、3和4的回收站选址个数。

【样例1输入】

7
12
21
00
11
18
20
01

【样例1输出】

9
0
1
8
0

代码

#include<bits/stdc++.h>
using namespace std;

const int N=300+5;

struct pos
{
    int x,y;
};

int main()
{
    int n;
    int a[5]={0};
    vector<pos> p;
    pos q;
    cin>>n;
    for(int i=0;i<n;i++)
    {
        cin>>q.x>>q.y;
        p.push_back(q);
    }

    for(int k=0;k<n;k++)
    {
        int neighbors=0,cnt=0;
        for(int i=0;i<n;i++)
        {
            if(p[i].x==p[k].x-1&&p[i].y==p[k].y)
                neighbors++;
            else if(p[i].x==p[k].x&&p[i].y==p[k].y-1)
                neighbors++;
            else if(p[i].x==p[k].x&&p[i].y==p[k].y+1)
                neighbors++;
            else if(p[i].x==p[k].x+1&&p[i].y==p[k].y)
                neighbors++;
            else if(p[i].x==p[k].x-1&&p[i].y==p[k].y-1)
                cnt++;
            else if(p[i].x==p[k].x-1&&p[i].y==p[k].y+1)
                cnt++;
            else if(p[i].x==p[k].x+1&&p[i].y==p[k].y-1)
                cnt++;
            else if(p[i].x==p[k].x+1&&p[i].y==p[k].y+1)
                cnt++;
        }
        if(neighbors==4)
            a[cnt]++;
    }
    for(int i=0;i<5;i++)
    {
        cout<<a[i]<<endl;
    }
    return 0;
}

向 AI 提问(基于本文内容)

评论