此方法内的数组因为无法储存十的九次方的答案因此只等计算70%的答案,故不推荐此方法(以下为70分版答案)
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner as=new Scanner(System.in);
int n=as.nextInt();//树的数量
int L=as.nextInt();//绿化图大小
int S=as.nextInt();//藏宝图大小
int[][] luHua=new int[L+1][L+1];//绿化图 Y X
int[][] canBao=new int[S+1][S+1];//藏宝图
int[][] tree=new int[n][2];//YX 绿化图里树的位置
int[][] canTree=new int[(canBao.length* canBao.length)][2];//藏宝图里的树的位置
int li=0;
for (int i=0;i<n;i++){//输入绿化图
int y=as.nextInt();
int x=as.nextInt();
// System.out.println("绿化"+i+" "+y+"这里是绿化图的加载"+x);
if(y< luHua.length- canBao.length+1 && x< luHua.length- canBao.length+1 ) {
tree[li][0] = y;
tree[li][1] = x;
li++;
// System.out.println(tree[i][0]+" "+tree[i][1]);
// System.out.println("记录的树量"+li+" y"+tree[i][0]+" x"+tree[i][1]);
}
luHua[y][x]=1;
}
int cesh=0;
int Treenum=0;//标记的树的数量
for (int i=S;i>=0;i--){//输入藏宝图
for (int ii=0;ii<S+1;ii++){
canBao[i][ii]=as.nextInt();
// System.out.println(canBao[i][ii]);
if (canBao[i][ii]==1){ canTree[Treenum][0]=i; canTree[Treenum][1]=ii; Treenum++; };
cesh++;
// System.out.println(cesh +"现在加载的是"+canBao[i][ii]);
}
}
/
int jishu=0;
//验证阶段
for(int i=0;i<li;i++){//便利绿化图里的树
//载入树
// System.out.println("树"+i);
int lingshi=0;
boolean or=true;
for (int t=0; t<canBao.length && or==true; t++){//判断两图是否相等
for (int ii=0; ii<canBao.length && or==true; ii++){
if(luHua[tree[i][0]+t] [tree[i][1]+ii] == canBao[t] [ii] ){
lingshi++;
}
else { or=false; }
}
}
if (lingshi== canBao.length* canBao.length){ jishu++; }
}
System.out.println(jishu );
}
}
以下为80分版答案,此版本解决了数组可能会过大的问题
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner as=new Scanner(System.in);
int n=as.nextInt();//树的数量
int L=as.nextInt();//绿化图大小
int S=as.nextInt();//藏宝图大小
int[][] canBaoTu=new int[S+1][S+1];//藏宝图
int[] tuHang=new int[(S+1)*(S+1)];
int[] tuLie=new int[(S+1)*(S+1)];
int[] lHang=new int[n]; // Y
int[] lLie=new int[n];// X
for (int i=0;i<n;i++){//输入绿化图
int y=as.nextInt();
int x=as.nextInt();
lHang[i]=y;
lLie[i]=x;
}
int Treenum=0;//标记的树的数量
for (int i=S;i>=0;i--){//输入藏宝图
for (int ii=0;ii<S+1;ii++){
canBaoTu[i][ii] = as.nextInt();// y x
int canBao=canBaoTu[i][ii];
if (canBao!=0){ tuHang[Treenum]=i; tuLie[Treenum]=ii; Treenum++;
}
}
}
int jishu=0;
//遍历树
for(int i=0;i<n;i++){//遍历绿化图的树
int y=lHang[i];//当前的绿化图里的树的Y轴
int x=lLie[i];//当前的绿化图里的树的X轴
boolean or=true;
for(int ii=0;ii<S+1 && or==true; ii++){//行 开始遍历藏宝图
for(int iii=0;iii<S+1 && or==true; iii++ ){//列
// System.out.println(canBaoTu[ii][iii]);
if(y+S+1>L ||x+S+1>L ){ or=false; break; }//防止过界
// System.out.println(x);
if(canBaoTu[ii][iii]==1){//如果
or=false;
for (int v=0;v<n;v++){
if( lHang[v]==(ii+y) && (iii+x)==lLie[v] ){
or=true;
break;//证明绿化图里的这个位置也有一棵树就行了
}
}
}
if(canBaoTu[ii][iii]==0) {
for (int v=0;v<n;v++){
if( lHang[v]==(ii+y) && (iii+x)==lLie[v] ){
or=false;//有一个树的的位置与当前位置一至的话or就为false
}
}
// 而这里要证明这里一棵树都没有
}
}
}
if(or){ jishu++;}
}
System.out.println(jishu );
}
}