题目链接.
算法思路
主要利用了三元数组思想来存储压缩矩阵。这里着重利用了 STL 中的pair
以及map
,代码显得比较简洁。用pair
存储垃圾坐标点,并用作中map
的键值,其次查找map
中的元素特别方便,且速度较快,只需O(N)。
#include <bits/stdc++.h>
using namespace std;
#define N 1005
int n;
pair<int, int> place[N]; //记录垃圾坐标
map <pair<int, int>, int> rubbish; //用 map 方便查找垃圾位置
int number[5] = {};//记录各个得分的回收站个数, number[i] 表示得分为 i 的回收站个数
int main()
{
int i, x, y;
scanf("%d", &n);
for ( i = 1; i <= n; i++)
{
scanf("%d%d", &place[i].first, &place[i].second);
rubbish[place[i]] = 1;
}
for ( i = 1; i <= n; i++)
{
x = place[i].first;
y = place[i].second;
if (rubbish[make_pair(x, y + 1)]
&& rubbish[make_pair(x, y - 1)]
&& rubbish[make_pair(x + 1, y)]
&& rubbish[make_pair(x - 1, y)])
{
number[rubbish[make_pair(x + 1, y + 1)]
+ rubbish[make_pair(x + 1, y - 1)]
+ rubbish[make_pair(x - 1, y + 1)]
+ rubbish[make_pair(x - 1, y - 1)]]++;
}
}
for ( i = 0; i <= 4; i++)
{
printf("%d\n", number[i]);
}
return 0;
}
结果分析
得分100分,用时15ms,空间使用2.984MB,时间复杂度为 O(N^2)。