题目
思路
大佬分析
坐标值范围比较大,而且坐标有可能是负数,难以用矩阵来存储坐标点,所以使用稀疏矩阵来存储。用STL的map来存储坐标是最为简单的。用C语言实现的话,要复杂很多,所以就不做题解了。
我的思路
运用到了map和pair两个容器,map在查询哪些数据存在时挺好用的。这道题因为值的范围=10^9,n<10^3,不能简单用矩阵来做,太浪费了。考虑稀疏矩阵做法。(这里用map来做其实也不是优解<见[稀疏矩阵定义及存储](http://www.360doc.com/content/09/0204/17/96202_2458312.shtml),但做题还是可以做的….)
代码
#include<iostream>
#include<map>
using namespace std;
const int N =1000+5;
pair<int,int> p[N]; //存放地址点x、y
int main(){
int num[5] ={0};
map<pair<int,int>,int> node_mp;//map映射
int n;
cin>>n;
for(int i=0;i<n;i++){
int temp_x,temp_y;
pair<int,int> p;
cin>>temp_x>>temp_y;
// p =make_pair(temp_x,temp_y); //注意 map会自动排序
// node_mp[p] =1;
p[i]=make_pair(temp_x,temp_y);
node_mp[p[i]]=1;
}
// cout<<node_mp.size()<<endl;
// for(map<pair<int,int>,int>::iterator it =node_mp.begin();it!=node_mp.end();it++){
// cout<<it -> first.first<<" "<<it -> first.second<<endl;
// }
cout<<node_mp.size()<<endl;
for(int i = 0; i < n; i++) {
int x = p[i].first;
int y = p[i].second;
// cout<<x<<" "<<y<<endl;
if(node_mp[make_pair(x-1,y)]&&node_mp[make_pair(x+1,y)]&&node_mp[make_pair(x,y+1)]&&node_mp[make_pair(x,y-1)]){
num[node_mp[make_pair(x-1,y-1)]+node_mp[make_pair(x-1,y+1)]+node_mp[make_pair(x+1,y+1)]+node_mp[make_pair(x+1,y-1)]]++;
}
}
cout<<num[0]<<endl;
cout<<num[1]<<endl;
cout<<num[2]<<endl;
cout<<num[3]<<endl;
cout<<num[4]<<endl;
return 0;
}