校选拔赛H题

//给出毛毯一部分,可以在平面内无限延伸
//问对给一个照片,是否能与毛毯匹配
#include <bits/stdc++.h>
using namespace std;
char mp1[53][53],mp[103][803];//毛毯,照片
int n,m,k;//毛毯行,列,照片数
int check(int x,int y,int w,int h){ //MP里的起始坐标偏移值,匹配MP1,成功就1,否则就0
    for(int i=0;i<n;i++)            //毛毯行
        for(int j=0;j<m;j++)        //毛毯列,下面mp1[i][j]是毛毯字符
           if(mp1[i][j]!=mp[(i+x)%w==0?(i+x):(i+x)%w][(j+y)%h==0?(j+y):(j+y)%h])return 0;//匹配失败
    return 1;//上面mp是照片,注意毛毯从0起存,照片是从1起存,取模时余0时0位是没有字符的
}//返1就是成功
int main(){
    cin>>n>>m>>k;           //输入毛毯高,长,照片数
    for(int i=0;i<n;i++)    //毛毯行
        for(int j=0;j<m;j++)//毛毯列
            cin>>mp1[i][j]; //输入
    while(k--){             //K张照
        int h,w,flag=1;cin>>h>>w;   //flag=1表示可行,输出照片高,宽
        for(int i=1;i<=h;i++){      //高
            for(int j=1;j<=w;j++){  //宽
                cin>>mp[i][j];      //输入
                if(i>n||j>m){       //行比N大,列比M大
                    int ni=i,nj=j;  //则定义新点
                    if(i>n)ni-=n;   //如果超毛毯宽就减
                    if(j>m)nj-=m;   //如果超毛毯高就减
                    if(mp[ni][nj]!=mp[i][j])flag=0;//如果不匹配就跳出
                }//上面的匹配是自身照片以毛毯为周期进行匹配,没用到毛毯的字符
            }
        }
        if(flag==0){cout<<"NO"<<endl;continue;}     //如果自身都不成周期就输出
        flag=0;                                     //先假定为不行
        for(int i=1;i<=min(n,h)&&flag==0;i++)       //行偏移
            for(int j=1;j<=min(m,w)&&flag==0;j++)   //列偏移
                if(check(i,j,w,h)==1)               //如果判到可以
                    flag=1;                         //就打上标记
        if(flag==1)cout<<"YES"<<endl;               //标记是1就YES
        else cout<<"NO"<<endl;                      //标记是0就NO
    }
    return 0;
}
/*
2 3 1
ABC
ABD
3 3
BCA
BDA
BCA

YES
*/
//我都知道还有BUG,先发布,补题有动力

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值