Subimage Recognition

本文介绍了一种通过移除部分像素行和列来判断一个图像是否为另一个图像子集的算法。该算法适用于图像尺寸不大于20x20的情况,并通过实例演示了如何使用0-1矩阵表示图像像素进行比对。

An image A is said to be a subimage of another image B if it is possible to remove some rows and/or columns of pixels from B so that the resulting image is identical to A. Figure 6 illustrates an example. Image A, shown in Figure 6(a), is a subimage of image B, shown in Figure 6(b), because the image resulting from the removal of the middle row and column of pixels from B is identical to A.

The input contains a single test case. The first line contains two integers r and c (1 ≤ rc ≤ 20), the dimensions of A. The following r lines, each containing a string of length c, give an r × c 0-1 matrix representing the pixels of A. The next line contains two integers R and C (r ≤ R ≤ 20; c ≤ C ≤ 20), the dimensions of B. The following R lines, each containing a string of length C, give an R × C 0-1 matrix representing the pixels of B. A 0 indicates a white pixel; a 1 indicates a black pixel.

If A is a subimage of B, print “Yes”; otherwise, print “No”.


由于r c都是不大于20的,所以我们暴力乱搞一通就好了O(∩_∩)O~~


#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
char a[22][22];
char b[22][22];
int r1,c1,r2,c2;
int id[22];
int main(){
    scanf("%d%d",&r1,&c1);
    for(int i=0;i<r1;i++)
        scanf(" %s",a[i]);
    scanf("%d%d",&r2,&c2);
    for(int i=0;i<r2;i++)
        scanf(" %s",b[i]);
    int ans=0;
    for(int i=0;i<(1<<r2);i++){
        int cnt=0;
        for(int k=0;k<r2;k++)
            if((1<<k)&i)
                id[cnt++]=k;
        if(cnt!=r1) continue;
        int st=0;
        int col;
        for(col=0;col<c1;col++){
            int flag=0;
            for(int pc=st;pc<c2;pc++){
                for(int row=0;row<r1;row++){
                    if(a[row][col]!=b[id[row]][pc])
                        break;
                    if(row==r1-1) flag=1;
                }
                if(flag) {st++;break;}
            }
            if(flag==0) {break;}
        }
        if(col==c1){ans=1;break;}
    }
    if(ans) cout<<"Yes"<<endl;
    else cout<<"No"<<endl;
    return 0;
}


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值