


//个人思路:根据题目描述先筛选出满足适合做垃圾站的坐标,然后再从这些垃圾站中判断每个垃圾站右上右下左上左下是否存在垃圾点(注意是垃圾点),每有一个加一分即可,根据题意即可。(详情见代码注释)
//回收站选址
#include<iostream>
using namespace std;
#define max 1005
typedef struct
{
int x, y;
int grbgBinFlag; //垃圾回收站标记,标记0代表不是站点
}GrbgPon;//垃圾点
void judegGrbgBin(GrbgPon gP[], int n);
void calcGrbgBinSrc(GrbgPon gP[], int n, int sum[]);
GrbgPon gP[max]; //全局区变量默认为0;
int main()
{
int n;//垃圾点坐标数
cin >> n;
int sum[5] = {0}; //最后计算的分数
for(int i = 0; i < n; ++i)//输入垃圾点坐标
cin >> gP[i].x >> gP[i].y;;
judegGrbgBin(gP,n);
calcGrbgBinSrc(gP,n,sum);
for(int i = 0; i < 5; ++i)
cout << sum[i] << endl;
return 0;
}
//判断是否是垃圾站点
void judegGrbgBin(GrbgPon gP[], int n) //n为垃圾点数目
{
for(int i = 0; i < n; ++i)
{
int pos = 0;//上下左右满足位置的个数,只有四个位置全部有垃圾点才是垃圾站
for(int j = 0; j < n; ++j)
{
//上下左右四侧
if((gP[i].x == gP[j].x && gP[i].y + 1 == gP[j].y)||
(gP[i].x == gP[j].x && gP[i].y - 1 == gP[j].y )||
(gP[i].x - 1 == gP[j].x && gP[i].y == gP[j].y) ||
(gP[i].x + 1 == gP[j].x && gP[i].y == gP[j].y) )
pos += 1;
}
if(pos == 4)
gP[i].grbgBinFlag = 1;//满足垃圾站要求
}
}
//计算垃圾站得分
void calcGrbgBinSrc(GrbgPon gP[], int n,int sum[])
{
for(int i = 0; i < n; ++i)
{
int pos = 0;
if(gP[i].grbgBinFlag == 1)
{
for(int j = 0; j < n; ++j)
{
//右上左上左下右下四侧
if(gP[i].x + 1 == gP[j].x && gP[i].y + 1 == gP[j].y||
gP[i].x - 1 == gP[j].x && gP[i].y + 1 == gP[j].y||
gP[i].x - 1 == gP[j].x && gP[i].y - 1 == gP[j].y||
gP[i].x + 1 == gP[j].x && gP[i].y - 1 == gP[j].y)
pos+=1;
}
//统计不同得分情况的回收站个数
switch(pos)
{
case 0:
sum[0]+=1;
break;
case 1:
sum[1]+=1;
break;
case 2:
sum[2]+=1;
break;
case 3:
sum[3]+=1;
break;
case 4:
sum[4]+=1;
break;
}
}
}
}