题意:r*c的01格子1,和R*C的01个格子2( <= 20),能否通过删除格子2的某些行和列使得格子1和格子2完全相同。
思路:暴力枚举删除某些列,然后观察是否完全匹配即可;
代码:
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
char mp1[25][25], mp2[25][25];
int a[25];
int r, c, R, C;
bool judge(){
int id = 0, row = 1;
while(id < R){
int fnd = 0, i;
for(i = id + 1; i <= R; i++)
{
int flag = 1;
for(int j = 0, col = 1; j < c; j++, col++)
{
if(mp1[row][col] != mp2[i][a[j]])
{
flag = 0;
break;
}
}
if(flag)//此行匹配成功
{
fnd = 1;
break;
}
}
if(!fnd)//到结束也没匹配成功
break;
row++;
id = i;
}
return row > r;
}
bool dfs(int index, int num){
if(num == c) return judge();
if(index > C) return false;
//删除此列
if(dfs(index + 1, num)) return true;
//不删除此列
a[num] = index;//记录所选列
if(dfs(index + 1, num + 1)) return true;
return false;
}
int main(){
while(cin>>r>>c){
for(int i = 1; i <= r; i++)
cin>>mp1[i];
cin>>R>>C;
for(int i = 1; i <= R; i++)
cin>>mp2[i];
puts(dfs(1, 0) ? "Yes" : "No");
}
return 0;
}