首先该题不难理解,且数据量较小只有10^3,因此该题是可以容许O(n^2)的,我们考虑使用暴力枚举,即枚举每一个点作为垃圾回收站的中心点,然后我们嵌套循环遍历是否存在该点的上下左右四个点都存在垃圾,同时还可以对该中心点的四个角进行垃圾计数,最后使用hash函数对各个分数的垃圾站数量进行计数即可
#include<iostream> using namespace std; int n,score=0; typedef struct Node{ int x,y; }Node; Node arr[1005]; int ans[5]; bool check(int index){//判断index的上下左右是否都存在垃圾 int x=arr[index].x,y=arr[index].y; int sign=0; for(int i=1;i<=n;i++){ if((arr[i].x==x+1&&arr[i].y==y)||(arr[i].x==x-1&&arr[i].y==y)||(arr[i].x==x&&arr[i].y==y+1)||(arr[i].x==x&&arr[i].y==y-1)){ sign++;//上下左右 } if((arr[i].x==x+1&&arr[i].y==y+1)||(arr[i].x==x-1&&arr[i].y==y-1)||(arr[i].x==x+1&&arr[i].y==y-1)||(arr[i].x==x-1&&arr[i].y==y+1)){ score++;//四个角 } } if(sign==4){ return true; } return false; } int main(){ cin>>n; for(int i=1;i<=n;i++){ cin>>arr[i].x>>arr[i].y; } for(int i=1;i<=n;i++){//遍历作为中心点的垃圾 score=0; if(check(i)){ ans[score]++; } } for(int i=0;i<5;i++){ cout<<ans[i]<<endl; } return 0; }