PKU 3600 Subimage Recognition

http://poj.org/problem?id=3600
Bというイメージからいくつかの行と列を削って、Aと同じイメージにできるかを答えろというような問題。

列の選択を全探索して、行を貪欲に当てはめて行きました。

string a[20],b[20];
int ar,ac,br,bc;
int el[20];
int es;

void dfs(int t){

  if(es==ac){
    int as=0;
    rep(i,br){
      bool ok=true;
      rep(j,es){
        if(a[as][j]!=b[i][el[j]]){
          ok=false;
          break;
        }
      }
      if(ok)++as;
      if(as==ar){
        cout<<"Yes"<<endl;
        exit(0);
      }
    }
    return;
  }
  if(t==bc)return;
  dfs(t+1);
  el[es++]=t;
  dfs(t+1);
  es--;
}

main(){
  cin>>ar>>ac;
  rep(i,ar)cin>>a[i];
  cin>>br>>bc;
  rep(i,br)cin>>b[i];
  dfs(0);
  cout<<"No"<<endl;
}