题目
![]() ![]() ![]() |
|---|
思路
大佬分析
坐标值范围比较大,而且坐标有可能是负数,难以用矩阵来存储坐标点,所以使用稀疏矩阵来存储。用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、yint 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;}



