【csp202206-2】寻宝!大冒险!(c++100分)

看见L<=10^9我就知道不能硬解,应该从n和s入手。第一次做的时候思路很乱,结果拿了20分。

第一次做的思路是这样的:藏宝图小矩阵中的下标和的最大值为2*s,那不妨给绿植表按坐标和排序。排序后遍历,对于每棵树,如果不足以延伸出一个和藏宝图小矩阵一样大的矩阵(即L-sx2*s。对于其中每棵树,如果相对位置中x-sx>s 或者y-sy>s则忽略,否则如果在藏宝图中相对位置上也有树,则计数一次,否则直接跳出循环。如果最终计数和藏宝图上的树的数量相同,则认为是一个可选地点。

第二次重新理了思路,顺便看了看别人是怎么做的。

第一次思路中的关键点是,在绿植图中选取一棵树作为起始点,然后检查其他的树,在藏宝图范围内的是否处于藏宝图上有树的位置。

那我们不妨尝试,遍历绿植图,跳过不足以延伸出和藏宝图矩阵大小一样大的矩阵的树;对于满足前提的树,以它为起始点(参照点)作一个和藏宝图一样大的矩阵,再次遍历绿植图,对于能落在藏宝图内的树,将对应位置填上。最后对比以这棵树做参照点的矩阵和藏宝图,相同,则算一个,不同,则丢掉。

#include
using namespace std;
struct p{
    int x;
    int y;
};
int main(){
    int n,l,s;
    cin>>n>>l>>s;
    p tree[n];
    for(int i=0;i>tree[i].x>>tree[i].y;
    }
    int pic[s+1][s+1];
    for(int i=s;i>=0;--i){
        for(int j=0;j<=s;++j){
            cin>>pic[i][j];
        }
    }
    int cont=0;
    for(int i=0;is or tree[j].y-sy<0 or tree[j].y-sy>s){
                continue;
            }
            temp[tree[j].x-sx][tree[j].y-sy]=1;    
        }
        int flag=0;
        for(int j=0;j<=s;++j){
            for(int k=0;k<=s;++k){
                if(temp[j][k]!=pic[j][k]){
                    flag=1;
                    break;
                }
            }
            if(flag==1){break;}
        }
        if(flag==0){
            cont++;
        }
    }
    cout<

所以以后做题,要注意:不要优先去想每一步该怎么做,而是确定大思路,先照着大思路写。如果在大思路中参杂过多的细节,很有可能会弄巧成拙!

你可能感兴趣的:(刷题合集,c++,算法,数据结构)