题目描述:
AC代码如下:
/*思路:
把A变成小块 因为B是A里的一部分
通过把A变成小块 去寻找B这样速度更快
如果A=B,B=A,说明找到了。
*/#include <iostream>
#include <cstring>
#include <algorithm>
#include <utility>
#define x first
#define y secondusing 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;
}