• BZOJ3750[POI2015]Pieczęć——链表


    题目描述

    一张n*m的方格纸,有些格子需要印成黑色,剩下的格子需要保留白色。
    你有一个a*b的印章,有些格子是凸起(会沾上墨水)的。你需要判断能否用这个印章印出纸上的图案。印的过程中需要满足以下要求:
    (1)印章不可以旋转。
    (2)不能把墨水印到纸外面。
    (3)纸上的同一个格子不可以印多次。

    输入

    第一行一个整数q(1<=q<=10),表示测试点数量。
    接下来q个测试点,每个测试点中:
    第一行包含4个整数n,m,a,b(1<=n,m,a,b<=1000)。
    接下来n行,每行m个字符,描述纸上的图案。'.'表示留白,'x'表示需要染黑。
    接下来a行,每行b个字符,描述印章。'.'表示不沾墨水,'x'表示沾墨水。

    输出

    对于每个测试点,输出TAK(是)或NIE(否)。

    样例输入

    2
    3 4 4 2
    xx..
    .xx.
    xx..
    x.
    .x
    x.
    ..
    2 2 2 2
    xx
    xx
    .x
    x.

    样例输出

    TAK
    NIE
     
    因为题目中的诸多限制,所以印章的左上角只能每次和没印的最左上角的格子对齐来印。
    只要将印章上突出的位置用链表存起来,每次找到方格纸上最上边没印的位置一次覆盖即可,覆盖时判断是否合法。
    #include<set>
    #include<map>
    #include<queue>
    #include<stack>
    #include<cmath>
    #include<vector>
    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #define ll long long
    using namespace std;
    int T;
    int n,m;
    int a,b;
    char ch[1010];
    int cnt;
    int flag;
    int num;
    int mp[1010][1010];
    int mx[1000010];
    int my[1000010];
    int sx[1000010];
    int sy[1000010];
    int fx,fy;
    bool check(int x,int y)
    {
        for(int i=1;i<=cnt;i++)
        {
            int px=x+sx[i];
            int py=y+sy[i];
            if(px>n||py>m||px<1||py<1)
            {
                return false;
            }
            if(!mp[px][py])
            {
                return false;
            }
            mp[px][py]=0;
        }
        return true;
    }
    int main()
    {
        scanf("%d",&T);
        while(T--)
        {
            cnt=0;
            num=0;
            memset(mp,0,sizeof(mp));
            flag=0;
            scanf("%d%d",&n,&m);
            scanf("%d%d",&a,&b);
            for(int i=1;i<=n;i++)
            {
                scanf("%s",ch+1);
                for(int j=1;j<=m;j++)
                {
                    if(ch[j]=='x')
                    {
                        num++;
                        mx[num]=i;
                        my[num]=j;
                        mp[i][j]=1;
                    }
                }
            }
            for(int i=1;i<=a;i++)
            {
                scanf("%s",ch+1);
                for(int j=1;j<=b;j++)
                {
                    if(ch[j]=='x')
                    {
                        if(!cnt)
                        {
                            fx=i;
                            fy=j;
                        }
                        cnt++;
                        sx[cnt]=i-fx;
                        sy[cnt]=j-fy;
                    }
                }
            }
            for(int i=1;i<=num;i++)
            {
                if(mp[mx[i]][my[i]])
                {
                    if(!check(mx[i],my[i]))
                    {
                        printf("NIE
    ");
                        flag=1;
                        break;
                    }
                }
            }
            if(!flag)
            {
                printf("TAK
    ");
            }
        }
    }
  • 相关阅读:
    分析Ajax并爬取微博列表
    链表01
    Install ping command from ubuntu docker
    In container,I can't use man
    centos install glances
    centos 服务器命令下安装GUI
    firefox浏览器配置
    xshell替代产品
    Linux下将一个文件压缩分包成多个小文件
    Linux生成大文件
  • 原文地址:https://www.cnblogs.com/Khada-Jhin/p/9660301.html
Copyright © 2020-2023  润新知