CCF-CSP 201912-2 回收站选址

201912-2 回收站选址

题目链接-201912-2 回收站选址
CCF-CSP 201912-2 回收站选址_第1张图片
解题思路
模拟
第一反应以为要用dfs做,后来发现STL就可以解决

  • pair来存取垃圾的坐标,map来储存这些坐标并将对应的value的值都设为1
  • 所以这样当一个点的value为1且相邻点的value都为1的时候,就可以确定该点可以作为回收站
  • cnt[]数组记录每种得分的回收站选址个数,确定的回收站对角位置点的value值相加即为该回收站得分,若该点得分为score,则以cnt[score]++记录
  • 具体操作见代码

附上代码

#include
#define int long long
#define lowbit(x) (x &(-x))
using namespace std;
const int INF=0x3f3f3f3f;
const int dir[4][2]={-1,0,1,0,0,-1,0,1};
const double PI=acos(-1.0);
const double eps=1e-10;
const int M=1e9+7;
const int N=1e5+5;
typedef long long ll;
typedef pair<int,int> PII;
map<PII,int> mp;
PII p[1010];
int cnt[10];
bool check(int x,int y){//判断该点是否可以建立回收站
	if(mp[make_pair(x-1,y)]&&mp[make_pair(x+1,y)]&&mp[make_pair(x,y+1)]&&mp[make_pair(x,y-1)])
		return 1;
	return 0;
} 
void count(int x,int y){
	cnt[mp[make_pair(x+1,y-1)]+mp[make_pair(x-1,y+1)]+mp[make_pair(x+1,y+1)]+mp[make_pair(x-1,y-1)]]++;
}
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	
	
	int n;
	cin>>n;
	for(int i=0;i<n;i++){
		int x,y;
		cin>>x>>y;
		p[i]=make_pair(x,y);
		mp[p[i]]=1;
	} 
	for(int i=0;i<n;i++){
		int x=p[i].first;
		int y=p[i].second;
		if(check(x,y))
			count(x,y);
	} 
	for(int i=0;i<5;i++)
		cout<<cnt[i]<<endl;
	return 0;
}

你可能感兴趣的:(CCF-CSP)