【NOIP模拟】鼎纹

来源:互联网 发布:7u分享网络怎么提现 编辑:程序博客网 时间:2024/06/03 22:56

Description

这里写图片描述

Solution

这一题,在三题中,看起来最难做,但是策略出错,先搞了第一题。
把第一题搞了两个小时之后,最后也只有90分。后两题本来很有信心的,然后还爆零,时间不够没有对拍。
这一题,很简单的一个构造题。
鼎纹的第一个1,肯定是有铜模的第一个1来匹配的,那么就直接做,然后再找第一个1,继续匹配……在途中如果不合法,那么就输出NO。
因为鼎纹的吗每个点只会搜到一次,所以时间复杂度是O(nm)

Code

#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#define fo(i,a,b) for(i=a;i<=b;i++)#define fod(i,a,b) for(i=a;i>=b;i--)using namespace std;const int maxn=3007,maxx=10007;int i,j,k,l,t,ans,cas,xx,yy,x,y,nx,ny,tou1,tou2;int a[maxn][maxn];int e[maxn][maxn];bool bz,az,cz[maxn][maxn];int yi,er;char ch[maxn];int main(){    for(scanf("%d",&cas);cas;cas--){        scanf("%d%d%d%d",&nx,&ny,&xx,&yy);        yi=er=0;        memset(cz,0,sizeof(cz));        fo(i,1,nx){            scanf("%s",ch+1);            fo(j,1,ny){a[i][j]=ch[j]-'0';if(a[i][j])cz[i][j]=1;}        }        fo(i,1,xx){            scanf("%s",ch+1);            fo(j,1,yy)e[i][j]=ch[j]-'0';        }        bz=1;        tou1=0;        fo(i,1,xx){            fo(j,1,yy){                if(e[i][j]==1){                    tou1=i,tou2=j;                    break;                }            }            if(tou1)break;        }        fo(i,1,nx){            fo(j,1,ny){                    if(cz[i][j]){                        k=tou1,l=tou2;                        while(k<=xx){                            if(e[k][l]&&!cz[i+k-tou1][j+l-tou2]){                                bz=0;                                break;                            }                            if(e[k][l])cz[i+k-tou1][j+l-tou2]=0;                            l++;                            if(l==yy+1)k++,l=1;                        }                        if(!bz)break;                    }                            if(!bz)break;                }                if(!bz)break;        }        if(bz)printf("YES\n");else printf("NO\n");    }}
2 0
原创粉丝点击