拿到题一看L是10的9次方就知道不能直接创建数组,铁超时。
那么一看n小于1000我就感觉应该以给出的n个点分别为原点创建一个大小为s的小数组,再用这个小数组与藏宝图的每个元素对比。
所以关键就在于如何创建小数组
应该先以某个点为原点,比如(1.1),将所有的点减去(1.1)再筛选所有减完以后的点,只要他大于等于0,小于等于s就可以放到新构造的小数组(temp)里面,重复操作所有的给出点(记得将temp清零)每次将temp对比藏宝图,若符合加一即可(记得要看一下小数组是否越过L)
给出代码
#include<bits/stdc++.h>
using namespace std;
int b1[1010][2];
long long temp[1010][1010],a1[1010][1010];
int main(){
int n,l,s;
cin>>n>>l>>s;
int a[n][2];
for(int i=0;i<n;i++){
cin>>a[i][0]>>a[i][1];
}
int b[s+1][s+1];
for(int i=s;i>=0;i--){
for(int j=0;j<=s;j++){
cin>>b[i][j];
}
}
int num=0,x,y;
for(int k=0;k<n;k++){
if(a[k][0]+s<=l&&a[k][1]+s<=l){
int flag=0;
x=a[k][0];
y=a[k][1];
for(int i=0;i<n;i++){
a1[i][0]=a[i][0]-x;
a1[i][1]=a[i][1]-y;
if(a1[i][0]>=0&&a1[i][1]>=0&&a1[i][0]<=s&&a1[i][1]<=s){
temp[a1[i][0]][a1[i][1]]=1;
}
}
for(int q=0;q<=s;q++){
for(int p=0;p<=s;p++){
if(temp[q][p]!=b[q][p])flag=1;
}
}
for(int q=0;q<=s;q++){
for(int p=0;p<=s;p++){
temp[q][p]=0;
}
}
if(flag==0)num++;
}
}
cout<<num;
}