22-6-2寻宝!大冒险!(csp)(Java)(100分)

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();//获取树木数量
        int l = sc.nextInt();//绿化图的长宽
        int s = sc.nextInt();//藏宝图的长宽
        int [][]tree=new int[n][2];//设定储存树木位置的数组
        int [][]box_map=new int[s+1][s+1];//设定储存宝藏图信息的数组
        for(int i=0;i<n;i++){//获取树木的纵横坐标
            tree[i][0]=sc.nextInt();
            tree[i][1]=sc.nextInt();
        }
        for(int i=s;i>=0;i--){//获取藏宝图的信息
            for(int j=0;j<=s;j++){
                box_map[i][j]= sc.nextInt();
            }
        }
        int ans=0;//储存符合条件的位置数量
        for(int i=0;i<n;i++){
            if(l-tree[i][0]<s||l-tree[i][1]<s){//判断是否越界,绿化图长宽-树木的纵横是否小于s,任意一方小于藏宝图尺寸则判为无效,直接跳跃到下一个大循环
                continue;
            }
            int [][]temp=new int [s+1][s+1];//设定临时存储数组
            for(int j=0;j<=s;j++){//将数组填充为零矩阵
                for(int k=0;k<=s;k++){
                    temp[j][k]=0;
                }
            }
            for(int j=0;j<n;j++){
                if(tree[j][0] - tree[i][0] < 0 || tree[j][1] - tree[i][1] < 0 || tree[j][0] - tree[i][0] > s || tree[j][1] - tree[i][1] > s){
                    continue;//判断是否越界,与0作比较是确保小循环j获取到的位置处于大循环i获取到的位置之后,可构成对应的区域来满足藏宝图的要求;与s作比较则如前一段判断中类同
                }
                temp[ tree[j][0] - tree[i][0] ][ tree[j][1] - tree[i][1] ]=1;//确定满足条件,将获取到的位置映射到零矩阵temp中,并将其赋值为1,即有树木在这里
            }
            int flag=0;//判断是否失败
            for(int j=0;j<=s;j++){
                for(int k=0;k<=s;k++){
                    if(temp[j][k]!=box_map[j][k]){//循环判断临时储存数组temp是否与藏宝图所标注的位置信息一致
                        flag=1;//不一致赋值为1,即失败
                        break;
                    }
                }
                if(flag==1){
                    break;
                }
            }
            if(flag==0){//通过位置信息判断,则对应符合条件的区域数量+1
                ans++;
            }
        }
        System.out.println(ans);
    }
}
 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值