NOIP提高组 鼎纹

来源:互联网 发布:电视盒子免费视频软件 编辑:程序博客网 时间:2024/05/17 09:31

Description

这里写图片描述

Data Constraint

这里写图片描述

Solution

我们发现,当我们搜到一个点为1,它的上方和右方的点都为0,那么显然我们只能用铜模的第一个为1的点对应覆盖上去。所以我们按照这样的思想,判断是否会减为负数即可。时间复杂度为O(N2)。

代码

#include<iostream>#include<cmath>#include<cstring>#include<cstdio>#include<algorithm>using namespace std;const int maxn=1005;int i,j,t,k,l,l1,x,y,r,b[maxn][maxn],a[maxn][maxn],c[maxn][maxn];int d[maxn*maxn][2],n,m,n1,m1,p,q,num;bool bz[maxn][maxn],bz1;char ch[maxn];int main(){//  freopen("data.in","r",stdin);    scanf("%d\n",&l1);    while (l1){        l1--;        scanf("%d%d%d%d\n",&n,&m,&n1,&m1);        for (i=1;i<=n;i++){            scanf("%s\n",&ch);            for (j=0;j<=m-1;j++)                a[i][j+1]=ch[j]-48;        }x=y=0;num=0;        for (i=1;i<=n1;i++){            scanf("%s\n",&ch);            for (j=0;j<m1;j++){                b[i][j+1]=ch[j]-48;                if (b[i][j+1]){                    if (!x && !y) x=i,y=j+1;                    d[++num][0]=i-x;d[num][1]=j+1-y;                }            }        }        bz1=true;        for (i=1;i<=n;i++)            for (j=1;j<=m;j++){                if (!bz1) break;                if (!a[i][j]) continue;                for (k=1;k<=num;k++){                    a[i+d[k][0]][j+d[k][1]]--;                    if (a[i+d[k][0]][j+d[k][1]]<0){                        bz1=false;break;                    }                }                if (!bz1) break;            }        if (!bz1) printf("NO\n");        else printf("YES\n");    }}
3 0
原创粉丝点击