问题描述
思路
根据题目要求发现若使用二维数组存储输入数据,则无法处理坐标为负数的情况且无法分配109 大小的二维数组,因此想到使用Map来存储坐标。根据题目要求判断输入坐标点是否是合理的回收站选址然后给与其评分即可。
代码
#include<iostream>
#include<map>
#include<vector>
#include<algorithm>
using namespace std;
struct point
{
int x;
int y;
point()
{
}
point(int a,int b)
{
x=a;
y=b;
}
bool operator<(const point &p)const//重载<运算符
{
if(x!=p.x)
return x<p.x;
else
return y<p.y;
}
};
map<point,int> M;
vector<int> ans(5,0);
//用于判断是否是回收站
int xi[4]={0,1,0,-1};
int yi[4]={1,0,-1,0};
bool isRecycle(point p)//判断是否是回收站
{
for(int i=0;i<4;i++)
if(M.find(point(p.x+xi[i],p.y+yi[i]))==M.end())
return false;
return true;
}
//用于统计回收站的评级
int xa[4]={1,-1,1,-1};
int ya[4]={-1,1,1,-1};
void Rate(point p)//对回收站进行评级
{
for(int i=0;i<4;i++)
if(M.find(point(p.x+xa[i],p.y+ya[i]))!=M.end())
M[p]++;
ans[M[p]]++;
}
int main()
{
//输出初始化
int n;
cin>>n;
for(int i=0;i<n;i++)
{
int a,b;
cin>>a>>b;
M[point(a,b)]=0;
}
//统计
map<point,int>::iterator it;
for(it=M.begin();it!=M.end();it++)
{
if(isRecycle(it->first))//是回收站
Rate(it->first);
}
for(int i=0;i<5;i++)
cout<<ans[i]<<endl;
return 0;
}