//给出毛毯一部分,可以在平面内无限延伸
//问对给一个照片,是否能与毛毯匹配
#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,先发布,补题有动力
校选拔赛H题
最新推荐文章于 2018-12-10 10:26:40 发布