http://poj.org/problem?id=3600
枚举subimage第一行在image中的位置,然后在image中选取c列,若这c列中有r行和subimage相同,那么即为有解。
code:
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std ;
int vis[21] ;
char smap[21][21], imap[21][21] ;
int r, c, R, C, flag ;
int check(int cr){ //判断imap中是否有r行与smap相同
int i, j, count = 0, x = 0, y = 0 ;
for(i=cr; i<R; i++){
y = 0 ;
for(j=0; j<c; j++)
if(smap[x][y]==imap[i][vis[j]])
y ++ ;
if(y==c) x ++ ;
}
if(x==r) return 1 ;
return 0 ;
}
void dfs(int cr, int num, int cc){
if(flag||cc>C) return ;
if(num==c){ //选取的列数为c时判断
flag = check(cr) ;
return ;
}
/*for(int i=cc; i<C; i++){
vis[num] = i ;
dfs(cr, num+1, i+1) ;
}*/
vis[num] = cc ;
dfs(cr, num+1, cc+1) ;
if(flag) return ;
dfs(cr, num, cc+1) ;
}
int main(){
int i, j ;
while(~scanf("%d%d", &r, &c)){
for(i=0; i<r; i++)
cin >> smap[i] ;
scanf("%d%d", &R, &C) ;
for(i=0; i<R; i++)
cin >> imap[i] ;
for(i=0; i<R-r+1; i++){ //枚举子图第一行所在位置
dfs(i, 0, 0) ;
if(flag) break ;
}
if(flag) printf("Yes\n") ;
else printf("No\n") ;
}
return 0 ;}
#include<cstring>
#include<iostream>
using namespace std ;
int vis[21] ;
char smap[21][21], imap[21][21] ;
int r, c, R, C, flag ;
int check(int cr){ //判断imap中是否有r行与smap相同
int i, j, count = 0, x = 0, y = 0 ;
for(i=cr; i<R; i++){
y = 0 ;
for(j=0; j<c; j++)
if(smap[x][y]==imap[i][vis[j]])
y ++ ;
if(y==c) x ++ ;
}
if(x==r) return 1 ;
return 0 ;
}
void dfs(int cr, int num, int cc){
if(flag||cc>C) return ;
if(num==c){ //选取的列数为c时判断
flag = check(cr) ;
return ;
}
/*for(int i=cc; i<C; i++){
vis[num] = i ;
dfs(cr, num+1, i+1) ;
}*/
vis[num] = cc ;
dfs(cr, num+1, cc+1) ;
if(flag) return ;
dfs(cr, num, cc+1) ;
}
int main(){
int i, j ;
while(~scanf("%d%d", &r, &c)){
for(i=0; i<r; i++)
cin >> smap[i] ;
scanf("%d%d", &R, &C) ;
for(i=0; i<R; i++)
cin >> imap[i] ;
for(i=0; i<R-r+1; i++){ //枚举子图第一行所在位置
dfs(i, 0, 0) ;
if(flag) break ;
}
if(flag) printf("Yes\n") ;
else printf("No\n") ;
}
return 0 ;}