试题编号: 201912-2
试题名称: 回收站选址
时间限制: 1.0s
内存限制: 512.0MB
需要注意的细节:
#include <bits/stdc++.h> // 包含所有标准库头文件
using namespace std;
#define ll long long // 定义 ll 为 long long 的别名
vector<int> score(10, 0); // 初始化一个大小为 10 的向量,所有元素初始值为 0
map<pair<ll, ll>, bool> mp; // 定义一个 map,键为一对 long long 类型的数,值为 bool 类型
vector<pair<ll, ll>> points; // 定义一个存储坐标对的向量
// 判断坐标 (x, y) 是否被上下左右四个方向的点包围
bool isable(ll x, ll y)
{
return mp[{x + 1, y}] && mp[{x - 1, y}] && mp[{x, y + 1}] && mp[{x, y - 1}] ? true : false;
}
// 计算坐标 (x, y) 的得分,得分为其四个对角线方向上存在的点的数量
int getscore(ll x, ll y)
{
int score = 0;
if (mp[{x + 1, y + 1}]) // 右上角
score++;
if (mp[{x + 1, y - 1}]) // 右下角
score++;
if (mp[{x - 1, y + 1}]) // 左上角
score++;
if (mp[{x - 1, y - 1}]) // 左下角
score++;
return score;
}
int main()
{
int n;
cin >> n; // 输入点的数量
for (int i = 0; i < n; i++)
{
ll x, y;
cin >> x >> y; // 输入每个点的坐标
mp[make_pair(x, y)] = true; // 将点存入 map 中
points.push_back(make_pair(x, y)); // 将点存入向量中
}
for (auto it : points)
{
ll x = it.first;
ll y = it.second;
if (isable(x, y)) // 如果点 (x, y) 被上下左右四个方向的点包围
{
score[getscore(x, y)]++; // 根据点 (x, y) 的得分更新 score 向量
}
}
for (int i = 0; i < 5; i++)
{
cout << score[i] << endl; // 输出得分为0 1 2 3 4的点的数量
}
return 0;
}```