(一)、题目描述
原题目链接:
[http://118.190.20.162/view.page?gpid=T99]
(二)、题目分析:
1.为什么用map来写?
不能创建矩阵,因为有非第一象限的坐标点;
无法使用二维数组存储,不能很好的找到坐标点之间的关系;
所以用map来写。
2.采用map来写的关键思想?
本题采用map编写程序的关键思想:把5个得分设为一维数组的下标,这种方法真的很高明。
(三)、代码描述
本题代码是参考的别人的,自己给代码加了注释;
代码参考链接:
https://www.cnblogs.com/blink-cz/p/12650727.html
对以上链接添加注释:
#include<bits/stdc++.h>
#include<map>
using namespace std;
const int N=5; //五种类型的得分 0 1 2 3 4
int ans[N]={0}; //数组初始化为0;
const int M=1000; // 测试数据 n小于等于1000;
pair<int ,int> p[M]; //pair是将2个数据组合成一个数据,存放一个键值对
int main()
{
int n;
cin>>n;
int x,y;
map<pair<int,int>,int> m; //创建一个map m;
//将坐标设置为键,将1设置为值标记有垃圾的坐标;
for(int i=0;i<n;i++)
{
cin>>x>>y;
p[i]=make_pair(x,y); //调用make_pair生成pair对象
m.insert(make_pair(p[i],1)); //将键值插入map;
}
for(int i=0;i<n;i++)
{
int x=p[i].first;
int y=p[i].second;
if(m.count(make_pair(x,y-1))&&m.count(make_pair(x-1,y))&&
m.count(make_pair(x,y+1))&&m.count(make_pair(x+1,y)))
//m.count 存在即为1,不存在即为0;
{
ans[m.count(make_pair(x+1,y+1))+m.count(make_pair(x+1,y-1))+
m.count(make_pair(x-1,y-1))+m.count(make_pair(x-1,y+1))]++;
}
}
for(int i=0;i<5;i++)
{
cout<<ans[i]<<"\n";
}
cout<<endl;
return 0;
}
(四)、结果验证
CCF官网提交,满分
(五)、关于map的知识点补充