Stamp Grid(USACO23 FEB Bronze T2)

题目:

这题直接暴力旋转印章再暴力比较是否有多余的黑色,如果没有,进行涂色即可,不需要任何优化。

注意:画布不可以旋转。

肝程序.jpg 程序一会发

注:虽然我喜欢用string但用string一直莫名其妙的错,懒得改了,就换成了char

程序:

#include<bits/stdc++.h>
using namespace std;
long long t,n,k;
char a[21][21],b[21][21],c[21][21];
bool p[21][21];
int boo,boo2;
int main()
{
    ios::sync_with_stdio(false);
    cin>>t;
    while(t--)
    {
        memset(a,0,sizeof a);
        memset(b,0,sizeof b);
        memset(c,0,sizeof c);
        memset(p,0,sizeof p);
        boo=0;
        boo2=0;
        cin>>n;
        for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) cin>>a[i][j];
        cin>>k;
        for(int i=1;i<=k;i++) for(int j=1;j<=k;j++) cin>>b[i][j];
        for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) if(a[i][j]=='.') p[i][j]=1;
        for(int v=1;v<=4;v++)
        {
            for(int i=1;i<=n-k+1;i++)
            {
                for(int j=1;j<=n-k+1;j++)
                {
                    for(int w=1;w<=4;w++)
                    {
                        boo=0;
                        for(int f=1;f<=k;f++) for(int g=1;g<=k;g++) c[g][k-f+1]=b[f][g];
                        for(int f=1;f<=k;f++) for(int g=1;g<=k;g++) b[f][g]=c[f][g];
                        for(int f=i;f<=i+k-1;f++) for(int g=j;g<=j+k-1;g++) if(a[f][g]=='.'&&b[f-i+1][g-j+1]=='*') boo=1;
                        if(!boo) for(int f=i;f<=i+k-1;f++) for(int g=j;g<=j+k-1;g++) if(a[f][g]=='*'&&b[f-i+1][g-j+1]=='*') p[f][g]=1;
                    }
                }
            }
        }
        for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) if(!p[i][j]) boo2=1;
        if(!boo2) printf("YES\n");
        else printf("NO\n"); 
    }
    return 0;
}

 

posted @ 2023-04-24 20:06  王浩泽  阅读(49)  评论(0编辑  收藏  举报