题目描述:
AC代码如下:
/*思路:
把A变成小块 因为B是A里的一部分
通过把A变成小块 去寻找B这样速度更快
如果A=B,B=A,说明找到了。
*/
#include <iostream>
#include <cstring>
#include <algorithm>
#include <utility>
#define x first
#define y second
using namespace std;
const int N = 1010,INF = 1e8;
typedef pair<int, int> PII;
PII shu[N];
int bao[60][60];
int main()
{
int n,L,S;
scanf("%d %d %d", &n,&L,&S);
int tc = 0;
for(int i=0;i<n;i++)
{
cin >> shu[i].x >> shu[i].y;
}
for (int i = S; i>=0; i -- )
{
for (int j = 0; j < S+1; j ++ )
{
cin >> bao[i][j];
tc += bao[i][j];
}
}
int res = 0;
for(int i=0;i<n;i++)
{
//以sx,sy为初始坐标去找
int sx = shu[i].x,sy = shu[i].y;
//不能越界,切勿越了A的上下左右边界
if(sx+S>L || sy+S>L) continue;
int cnt = 0;
for (int j = 0; j < n; j ++ )
{
//以sx,sy为藏宝图左下角(0,0)为原点去找跟B匹配的
int x = shu[j].x,y = shu[j].y;
if(x-sx<=S && x>=sx && y>=sy && y-sy<=S)
{
//这里只需要去找此坐标下宝藏图的位置有无1的存在
if(!bao[x-sx][y-sy]) cnt = -INF; //INF是一个很大的负数,因为cnt最大不会超过1个亿
else cnt ++;
}
}
//如果对应坐标下全是1且位置相同 说明数目也相同
if(cnt == tc) res++;
}
cout << res;
return 0;
}