csp 回收站选址 c++满分实现

思路:因为坐标值可能为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;
} 

  • 21
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值