#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;
}
CSP202206-2寻宝!大冒险!
最新推荐文章于 2024-03-28 14:00:00 发布