用一个set+二维坐标映射到一维解决
题目给的是L<=10e9,所以其实也可以不用unsigned,都这么写了就算了
#include<stdio.h>
#include<stdlib.h>
#include<set>
using namespace std;
int n,l,s,count=0;
set<unsigned long long> A2;
char BB[51][51];
bool findInAA(unsigned int x, unsigned int y){
return A2.find(((unsigned long long)x << 32) + y) != A2.end();
}
void putInAA(unsigned int x, unsigned int y){
A2.insert(((unsigned long long)x << 32) + y);
}
int main(){
scanf("%d%d%d",&n,&l,&s);
l++,s++;
unsigned int x, y;
for(int i = 0; i < n; i++){
scanf("%u%u", &x,&y);
putInAA(x,y);
}
int tmp;
for(int i = s-1; i >= 0; i--){
for(int j = 0; j < s; j++){
scanf("%d", &tmp);
BB[i][j] = (tmp==1);
}
}
int count = 0;
for(auto p = A2.begin(); p != A2.end(); p++){
unsigned int x = (*p)>>32, y = (unsigned int)(*p);
if(x > l-s || y > l-s) continue;
//起始点为(x,y):
bool flag = true;
for(int bx = 0; bx < s && flag; bx++){
for(int by = 0; by < s && flag; by++){
bool a = BB[bx][by];
bool b = findInAA(x+bx,y+by);
flag = !(BB[bx][by] ^ findInAA(x+bx,y+by));
}
}count += flag;
}printf("%d\n", count);
return 0;
}
CCF CSP认证:http://118.190.20.162/view.page?gpid=T147