思路:
将点的坐标设为map的键,将点上是否存在垃圾作为map的值(存在为1)。
通过num[score]求得得分0 1 2 3 4点的个数
#include<iostream>
#include<map>
using namespace std;
int num[5];//选址得分0 1 2 3 4点的个数
void isPlace(map<pair<int, int>, int >map, pair<int, int> p);//判断该点上下左右是否有垃圾(条件二)及可以被选址时的得分情况(条件三)
int main()
{
int n; cin >> n;
map<pair<int, int>, int >map;
int x, y;
for (int i = 0; i < n; i++)
{
cin >> x >> y;
map[make_pair(x, y)] = 1;
}
for (auto it=map.begin();it!=map.end();it++)
{
if (map[make_pair(x, y)])//判断该点是否有垃圾(条件一)
isPlace(map, it->first);
}
for (int i = 0; i < 5; i++)
//cout << i << " 个数为: " << num[i] << endl;
cout << num[i] << endl;
return 0;
}
void isPlace(map<pair<int, int>, int >map, pair<int, int> p)
{
int x = p.first, y = p.second;
if (map[make_pair(x, y + 1)] && map[make_pair(x, y - 1)] && map[make_pair(x + 1, y)] && map[make_pair(x - 1, y)])
{//(x,y)可以被选址
int score = 0;
//cout << "选定地点为:" << x << " " << y << endl;
for (int i = -1; i <= 1; i = i + 2)
for (int j = -1; j <= 1; j = j + 2)
if (map[make_pair(x + i, y + j)])
{
score += map[make_pair(x + i, y + j)];
}
num[score]++;
}
}
测试数据
7
1 2
2 1
0 0
1 1
1 0
2 0
0 1
11
9 10
10 10
11 10
12 10
13 10
11 9
11 8
12 9
10 9
10 11
12 11