An image A is said to be a subimage of another image B if it is possible to remove some rows and/or columns of pixels from B so that the resulting image is identical to A. Figure 6 illustrates an example. Image A, shown in Figure 6(a), is a subimage of image B, shown in Figure 6(b), because the image resulting from the removal of the middle row and column of pixels from B is identical to A.
The input contains a single test case. The first line contains two integers r and c (1 ≤ r, c ≤ 20), the dimensions of A. The following r lines, each containing a string of length c, give an r × c 0-1 matrix representing the pixels of A. The next line contains two integers R and C (r ≤ R ≤ 20; c ≤ C ≤ 20), the dimensions of B. The following R lines, each containing a string of length C, give an R × C 0-1 matrix representing the pixels of B. A 0 indicates a white pixel; a 1 indicates a black pixel.
If A is a subimage of B, print “Yes”; otherwise, print “No”.
由于r c都是不大于20的,所以我们暴力乱搞一通就好了O(∩_∩)O~~
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
char a[22][22];
char b[22][22];
int r1,c1,r2,c2;
int id[22];
int main(){
scanf("%d%d",&r1,&c1);
for(int i=0;i<r1;i++)
scanf(" %s",a[i]);
scanf("%d%d",&r2,&c2);
for(int i=0;i<r2;i++)
scanf(" %s",b[i]);
int ans=0;
for(int i=0;i<(1<<r2);i++){
int cnt=0;
for(int k=0;k<r2;k++)
if((1<<k)&i)
id[cnt++]=k;
if(cnt!=r1) continue;
int st=0;
int col;
for(col=0;col<c1;col++){
int flag=0;
for(int pc=st;pc<c2;pc++){
for(int row=0;row<r1;row++){
if(a[row][col]!=b[id[row]][pc])
break;
if(row==r1-1) flag=1;
}
if(flag) {st++;break;}
}
if(flag==0) {break;}
}
if(col==c1){ans=1;break;}
}
if(ans) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
return 0;
}