CSP202206-2寻宝!大冒险!

#include<iostream>
#include<set>
using namespace std;
typedef pair<int,int> PII;
const int N=55;
set<PII>s;
int n,S,L,cnt;
//int A[1e9+10],B[N];
//用set存储A绿化图中有树的点即可,大大节省空间
int B[N][N]; 
int main()
{
	cin>>n>>L>>S;
	for(int i=0;i<n;i++)
	{
		int x,y;
		cin>>x>>y;
		s.insert({x,y});//存储A中有树的点 
	}
	for(int i=S;i>=0;i--)
		for(int j=0;j<=S;j++)
			cin>>B[i][j];
	//for(PII tree:s)//比C++98更高的版本可以使用 
	for(set<PII>::iterator it=s.begin();it!=s.end();it++)
	{
		//int x=tree.first,y=tree.second;//比C++98更高的版本可以使用 
		int x=(*it).first,y=(*it).second;
		if(x+S>L||y+S>L) continue;//A中有树的点再加上B的边长超出边界,不合题意 
		bool flag=true;
		for(int i=0;i<=S;i++)//对于A中有树的点,遍历B数组,不能遍历A数组 
		{
			for(int j=0;j<=S;j++)
			{	
				//藏宝图B中为1,绿化图中为0 (不存在s中,因为s存储的是所有有树的即为1的点) 
				if(B[i][j]&&!s.count({x+i,y+j})) //(x+i,y+j)是B(i,j)映射的A中的坐标A[x+i,y+j] 
				{
					flag=false;
					break;
				}
				//该点在藏宝图B中为0,绿化图中为1(存在s中) 
				else if(!B[i][j]&&s.count({x+i,y+j}))
				{
					flag=false;
					break;
				}
			}
			if(!flag) break;
		}
		if(flag) cnt++;
	}
	cout<<cnt<<endl;
	return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值