CCF CSP 202206-2寻宝大冒险[带注释满分]

#include<iostream>
#include<map>
#include<set>
using namespace std;
set<pair<int,int>> lht;
int B[50+5][50+5];
typedef set<pair<int,int>>::iterator Iterator;
int main(){
    int n;//树的棵树
    int L;//绿化图的大小
    int S;//藏宝图的大小
    //依次表示绿化图中树的坐标 
    cin>>n>>L>>S;
    for(int i=0;i<n;i++) {
        int x,y;//树的坐标
        cin>>x>>y;
        pair<int,int> node = make_pair(x,y);
        lht.insert(node);
    }
    //输入完整的藏宝图 
    for(int i=S;i>=0;i--){
        for(int j=0;j<=S;j++){
            cin>>B[i][j];
        }
    }
    //对绿化图中的每棵树进行检测 
    int count = 0;
    for(Iterator it = lht.begin();it!=lht.end();it++){
        pair<int,int> node = *it;//绿化图中的某棵树
        int x = node.first;
        int y = node.second;
//        cout<<"绿化图中的树坐标x= "<<x<<" y= "<<y<<endl;
        bool flag = true;
        //以绿化图某棵树[x,y]作为原点,与藏宝图中的B[0][0]重合,遍历藏宝图 
        for(int i=0;i<=S;i++){
            for(int j=0;j<=S;j++){
                int A_x = x+i;
                int A_y = y+j;
//                cout<<"试探绿化图A_x= "<<A_x<<"A_y= "<<A_y<<endl;
                if(A_x>L || A_y>L) flag = false;//藏宝图右上角超出绿化图边界 
                pair<int,int> Anode = make_pair(A_x,A_y);
                if(lht.find(make_pair(A_x,A_y))==lht.end()){
//                    cout<<"试探绿化图A_x= "<<A_x<<"A_y= "<<A_y<<"此处不是树"<<endl;
                    if(B[i][j]==1) //藏宝图是树 
                        flag = false;
                }else{
                    if(B[i][j]!=1){
                            flag = false;                    
                    }
                }
            }
            if(flag==false) break;
        }
        if(flag) count++; 
    }
    cout<<count<<endl;
    
    //输出藏宝图的正序 
//    for(int i=0;i<=S;i++){
//        for(int j=0;j<=S;j++){
//            cout<<B[i][j]<<" ";
//        }
//        cout<<endl;
//    }
    return 0;
}
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值