参考文章
解题思路
点与点之间两两比较判断。
注意:此题不能用地图存储点的位置,空间占用太大!
代码实现
#include<iostream>
#define N 1001
typedef long long ll;
using namespace std;
struct point{
ll x;
ll y;
}buf[N];
int n;
int cnt[5]; // 记录5种分数的数目
int b[N];
int main()
{
// 输入
cin>>n;
for(int i=0;i<n;i++) cin>>buf[i].x>>buf[i].y;
// 记录每个点的连接数
for(int i=0;i<n;i++){
for(int j=i+1;j<n;j++){
// 判断是否是回收站地址
if((buf[i].x==buf[j].x&&buf[i].y==buf[j].y-1)||(buf[i].x==buf[j].x&&buf[i].y-1==buf[j].y)
||(buf[i].x-1==buf[j].x&&buf[i].y==buf[j].y)||(buf[i].x==buf[j].x-1&&buf[i].y==buf[j].y)){
// 两个点的连接数都递增
b[i]++;
b[j]++;
}
}
}
for(int i=0;i<n;i++){
int sum=0;
if(b[i]==4){ // 四个方位都是
for(int j=0;j<n;j++){
// 统计其他相邻的对角点数目
if((buf[i].x-1==buf[j].x&&buf[i].y-1==buf[j].y)||(buf[i].x==buf[j].x-1&&buf[i].y==buf[j].y-1)
||(buf[i].x-1==buf[j].x&&buf[i].y==buf[j].y-1)||(buf[i].x==buf[j].x-1&&buf[i].y-1==buf[j].y)) {
sum++;
}
}
cnt[sum]++;
}
}
// 输出
for(int i=0;i<5;i++){
cout<<cnt[i]<<endl;
}
return 0;
}