CCF-CSP 寻宝!大冒险! 80分 Java版答案

此方法内的数组因为无法储存十的九次方的答案因此只等计算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 );
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值