题意:给一个小矩阵和一个大矩阵,问你将大矩阵的一些行和一些列去掉后能后变成小矩阵
思路:因为列数只有20,所以dfs爆搜即可,然后行就可以直接判断一下删除一些列后是否还可以满足
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int inf=0x3f3f3f3f;
const ll INF=0x3f3f3f3f3f3f3f3fll;
const int maxn=30;
char str[maxn][maxn];
int A[maxn][maxn],B[maxn][maxn],flag,sum[maxn],cnt[maxn];
int r,c,R,C;
bool vis[maxn];
int judge(){
int ff=0;
for(int i=0;i<R;i++){
int fff=0;
for(int j=0;j<C;j++){
if(vis[j]==1) continue;
if(B[i][j]==A[ff][fff]) fff++;
}
if(fff>=c) ff++;
}
if(ff<r) return 0;
return 1;
}
void dfs(int deep){
int tmp=judge();
if(tmp==0) return ;
if(deep==0) flag=tmp;
if(deep==0||flag) return ;
for(int i=0;i<C;i++){
if(flag) return ;
if(vis[i]==0){
vis[i]=1;
dfs(deep-1);
vis[i]=0;
}
}
}
int main(){
while(scanf("%d%d",&r,&c)!=-1){
memset(sum,0,sizeof(sum));
for(int i=0;i<r;i++) scanf("%s",str[i]);
for(int i=0;i<r;i++) for(int j=0;j<c;j++) {A[i][j]=str[i][j]-'0';if(A[i][j]==1) sum[i]++;}
scanf("%d%d",&R,&C);
for(int i=0;i<R;i++) scanf("%s",str[i]);
for(int i=0;i<R;i++) for(int j=0;j<C;j++) B[i][j]=str[i][j]-'0';
flag=0;
memset(vis,0,sizeof(vis));
dfs(C-c);
if(flag) printf("Yes\n");
else printf("No\n");
}
return 0;
}