现在的位置: 首页 > 综合 > 正文

poj 3600 Subimage Recognition (枚举+dfs)

2012年08月30日 ⁄ 综合 ⁄ 共 1259字 ⁄ 字号 评论关闭

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, 00) ;
            if(flag)    break ;
        }
        if(flag)    printf("Yes\n") ;
        else        printf("No\n") ;
    }
    return 0 ;}
【上篇】
【下篇】

抱歉!评论已关闭.