c++代码如下:
#include<bits/stdc++.h>
using namespace std;
struct T
{
int x,y;
};//记录树的位置
int n,L,S;
int main()
{
cin >> n >> L >> S;
int s[S+1][S+1];
map<int, map<int, int>> mp;//有树为1
T t[n+1];
int x,y;
for(int i=0;i<n;i++)
{
cin >> x >> y;
mp[x][y]=1;
t[i].x=x;
t[i].y=y;
}
for(int i=S;i>=0;i--)
{
for(int j=0;j<=S;j++)
{
cin >> s[i][j];
}
}//输入藏宝图
int ans=0;
for(int i=0;i<n;i++)
{
x=t[i].x;
y=t[i].y;//宝藏的起点必有树
int flag=1;
for(int j=0;j<=S;j++)
{
for(int k=0;k<=S;k++)
{
if(x+j>L||y+k>L||mp[x+j][y+k]!=s[j][k])//长度范围不能超,树的位置相同
{
flag=0;
break;
}
}
if(!flag)
break;
}
if(flag)//均满足++
ans++;
}
cout << ans;
return 0;
}
用结构体存储树的位置,同时用map< int , map<int,int> > mp 标记有树的位置为1,
即mp[x][y]=1(效果同二维数组);
用二维数组存储藏宝图的坐标,有树为1,无树为0;
最后从第一棵树的位置开始遍历藏宝图(因为宝藏的起点必有树),遍历过程如果坐标超过边界L或者树的位置不同则跳出并判为false,否则为true,ans++;
输出ans