题目

在这里插入图片描述
201912-02回收站选址 - 图2
201912-02回收站选址 - 图3

思路

大佬分析

坐标值范围比较大,而且坐标有可能是负数,难以用矩阵来存储坐标点,所以使用稀疏矩阵来存储。用STL的map来存储坐标是最为简单的。用C语言实现的话,要复杂很多,所以就不做题解了。

我的思路

运用到了map和pair两个容器,map在查询哪些数据存在时挺好用的。这道题因为值的范围=10^9,n<10^3,不能简单用矩阵来做,太浪费了。考虑稀疏矩阵做法。(这里用map来做其实也不是优解<见[稀疏矩阵定义及存储](http://www.360doc.com/content/09/0204/17/96202_2458312.shtml),但做题还是可以做的….)

代码

  1. #include<iostream>
  2. #include<map>
  3. using namespace std;
  4. const int N =1000+5;
  5. pair<int,int> p[N]; //存放地址点x、y
  6. int main(){
  7. int num[5] ={0};
  8. map<pair<int,int>,int> node_mp;//map映射
  9. int n;
  10. cin>>n;
  11. for(int i=0;i<n;i++){
  12. int temp_x,temp_y;
  13. pair<int,int> p;
  14. cin>>temp_x>>temp_y;
  15. // p =make_pair(temp_x,temp_y); //注意 map会自动排序
  16. // node_mp[p] =1;
  17. p[i]=make_pair(temp_x,temp_y);
  18. node_mp[p[i]]=1;
  19. }
  20. // cout<<node_mp.size()<<endl;
  21. // for(map<pair<int,int>,int>::iterator it =node_mp.begin();it!=node_mp.end();it++){
  22. // cout<<it -> first.first<<" "<<it -> first.second<<endl;
  23. // }
  24. cout<<node_mp.size()<<endl;
  25. for(int i = 0; i < n; i++) {
  26. int x = p[i].first;
  27. int y = p[i].second;
  28. // cout<<x<<" "<<y<<endl;
  29. 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)]){
  30. 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)]]++;
  31. }
  32. }
  33. cout<<num[0]<<endl;
  34. cout<<num[1]<<endl;
  35. cout<<num[2]<<endl;
  36. cout<<num[3]<<endl;
  37. cout<<num[4]<<endl;
  38. return 0;
  39. }