思路:因为坐标值可能为10的9次,所以传统上用数组来标记一个位置有没有垃圾不太现实(因为可能出现a[x][y]是a[100000000][1000000000]),所以可以使用map的特性(map<string,int>mp),就是mp[N],这个N并不代表是map的开拓的规模,N只是表示有一个键为N,那么N取多大的int或者多长的string都可以,那么可以将垃圾的x和y坐标组合成1个字符串temp,那么mp[temp]=1即可以表明一个xy坐标上有垃圾,如果坐标(x1,y1)坐标没有垃圾(假设x1,y1组成字符串temp1),那么mp[temp1]就没有提前定义,只要map定义在main函数外面,那么mp[temp1]就等于0,此时就可以达到判断的目的
步骤:
1.定义一个结构体 a,用于存储坐标点的 x 和 y 值。
2.使用 map 数据结构 mp 来记录坐标点是否存在垃圾的信息,键为坐标点的字符串表示(通过坐标 x 和 y 拼接而成),值为 1 表示存在垃圾。
3.定义两个函数:fun 和 fun1。
4.fun 函数将坐标转变为字符串形式,通过将 x 和 y 值转换为字符串并拼接得到结果。
5.fun1 函数判断一个坐标点是否存在垃圾,通过检查 mp 中对应的键值是否为 1 来判断。
6.读入输入的值 n,表示坐标点的数量。
7.循环读入坐标点的 x 和 y 值,并将其存储到结构体数组 A 中,并根据坐标点的字符串表示,在 mp 中标记存在垃圾。
8.遍历所有坐标点,判断当前点的上、下、左、右四个方向的相邻点是否都存在垃圾,并统计相邻点存在垃圾的个数 cntt。
9.根据 cntt 值,更新评分数组 a 中对应的元素。
10.最后输出评分数组 a 中的前 5 个元素。
#include<bits/stdc++.h>
using namespace std;
int n;
map<string,int>mp;
struct a {
int x;
int y;
};
a A[1003];
int a[7];//用来记录评分
string fun(int aa,int bb){//将坐标转变为字符串 x+y
string m1=to_string(aa);
string m2=m1.append("+");
string m3=to_string(bb);
string m4=m2.append(m3);
return m4;
}
int fun1(int xt,int yt){ //判断一个点是否有垃圾
string temp2=fun(xt,yt);
if(mp[temp2]==1){
return 1;
}
else{
return 0;
}
}
int main(){
cin>>n;
for(int i=0;i<n;i++){
int x1,y1;
cin>>x1>>y1;
A[i].x=x1;
A[i].y=y1;
string temp1=fun(x1,y1);
mp[temp1]=1;
}
for(int i=0;i<n;i++){
int xt=A[i].x;
int yt=A[i].y;
if(fun1(xt,yt+1)==1&&fun1(xt,yt-1)==1&&fun1(xt+1,yt)==1&&fun1(xt-1,yt)==1){
int cntt=fun1(xt-1,yt-1)+fun1(xt+1,yt+1)+fun1(xt-1,yt+1)+fun1(xt+1,yt-1);
a[cntt]++;
}
}
for(int i=0;i<=4;i++){
cout<<a[i]<<endl;
}
return 0;
}