?
#include<iostream>
#include<map> //map中键值对的构造需要引入pair,因此包含utility头文件
int score[5]; //记录不同分数的选址个数,例如score[0]表示0分选址的个数
using namespace std;
int main(){
int n;
scanf("%d",&n); //输入垃圾点个数
pair<int,int> p[n+1]; //存放垃圾点对应的坐标
map<pair<int,int>,bool> m; //将垃圾点标记为true,用map绑定
for(int i=1;i<=n;i++){ //循环输入垃圾点
int x,y;
scanf("%d%d",&x,&y); //输入垃圾点坐标
p[i].first = x;
p[i].second = y;
m[p[i]] = true; //将该垃圾点标记为true
}
for(int i=1;i<=n;i++){//从第一个垃圾点开始检测
//垃圾点(x,y)的上、左、下、右处的坐标的x和y值
int upper_x = p[i].first;
int upper_y = p[i].second-1;
int down_x = p[i].first;
int down_y = p[i].second+1;
int left_x = p[i].first-1;
int left_y = p[i].second;
int right_x = p[i].first+1;
int right_y = p[i].second;
//垃圾点(x,y)的上、左、下、右处的坐标
pair<int,int> upper = make_pair(upper_x,upper_y);
pair<int,int> down = make_pair(down_x,down_y);
pair<int,int> left = make_pair(left_x,left_y);
pair<int,int> right = make_pair(right_x,right_y);
//判断是否符合选址的条件
if(m[upper]&&m[down]&&m[left]&&m[right]){
//符合选址的条件后,再判断该选址(x,y)的分数
//成为选址的垃圾点(x,y)的四个对角线位置的坐标的x,y值
//lu左上,ld左下,ru右上,rd右下
int lu_x = p[i].first -1;
int lu_y = p[i].second -1;
int ld_x = p[i].first -1;
int ld_y = p[i].second +1;
int ru_x = p[i].first +1;
int ru_y = p[i].second -1;
int rd_x = p[i].first+1;
int rd_y = p[i].second+1;
//lu左上,ld左下,ru右上,rd右下
pair<int,int> lu = make_pair(lu_x,lu_y);
pair<int,int> ld = make_pair(ld_x,ld_y);
pair<int,int> ru = make_pair(ru_x,ru_y);
pair<int,int> rd = make_pair(rd_x,rd_y);
//开始统计垃圾点(x,y)的得分
int count = 0;
if(m[lu]){ //左上位置的垃圾点是否标记为true
count++;
}
if(m[ld]){//左下位置的垃圾点是否标记为true
count++;
}
if(m[ru]){//右上位置的垃圾点是否标记为true
count++;
}
if(m[rd]){//右下位置的垃圾点是否标记为true
count++;
}
//每比较完一个符合条件的选址,将对应得分为count的选址个数加1
score[count]++;
}
}
//循环输出得分为0、1、2、3、4 的回收站选址的个数
for(int i=0;i<=4;i++)
cout<<score[i]<<endl;
return 0;
}
|