解题思路:
本题为稀疏图,故静态二维,三维数组不易做,我采用结构体保存点坐标,map保存各店是否被访问(有垃圾),其实map作为动态分配空间的三维数组,在map中使用结构体做key值时注意,由于map和set一样都是自动排序(二叉树),故当对结构体进行排序的时候需要进行重载(重新规定结构体的排序方式),格式一定严格,否则会报错。因为结构体中只有x,y,故用pair做map的key值最佳,当时没想到,故直接做了。
#include<iostream>
#include<map>
using namespace std;
typedef struct node{
int x,y;
bool operator<(const struct node& other) const{
if(x!=other.x)
return x<other.x;
else
return y<other.y;
}
}Node;
Node dian[1002];
map<Node,int > ma;
int main(){
int n;
cin>>n;
int cnt[5]={0};
for(int i=0;i<n;i++){
Node tmp;
cin>>tmp.x>>tmp.y;
//map无法直接访问键值,所以键值需要另存在dian【N】中
ma[tmp]=1;
dian[i].x=tmp.x;
dian[i].y=tmp.y;
}
for(int i=0;i<n;i++){
Node tmp1=dian[i];tmp1.x--;
Node tmp2=dian[i];tmp2.x++;
Node tmp3=dian[i];tmp3.y--;
Node tmp4=dian[i];tmp4.y++;
if(ma[tmp1]&&ma[tmp2]&&ma[tmp3]&&ma[tmp4]){
tmp1.y--,tmp2.y++,tmp3.x++,tmp4.x--;
//在上下左右的基础上,将点移到左下,右上,左上,右下进行判断。
cnt[ma[tmp1]+ma[tmp2]+ma[tmp3]+ma[tmp4]]++;
}
}
for(int i=0;i<=4;i++){
cout<<cnt[i]<<endl;
}
return 0;
}