[POJ 3600] Subimage Recognition [枚举+贪心]
2014-08-23 22:01
561 查看
已知一个两个01矩阵,矩阵A的行数不超过矩阵B的行数,矩阵A的列数不超过矩阵B的列数,问是否存在一种方法,去掉矩阵B的某些行和某些列,使得缩小后的矩阵B能够和矩阵A完全相同。
因为数据范围是20,所以直接枚举矩阵B删除了哪些列,然后判定能否成功。
判定能否成功的方法是,贪心,从上往下,能用A的第i行匹配B的第j行,就匹配,否则看j+1行。
因为数据范围是20,所以直接枚举矩阵B删除了哪些列,然后判定能否成功。
判定能否成功的方法是,贪心,从上往下,能用A的第i行匹配B的第j行,就匹配,否则看j+1行。
#include <cstdio> #include <cstring> int b[20][20]; bool choose[20]; int a[20]; int bb[20]; int r,c,R,C; bool check() { int i,j; for (i=0;i<R;i++) { int o=0; for (j=0;j<C;j++) { if (choose[j]) o=(o<<1)+b[i][j]; } bb[i]=o; } i=j=0; while (i<r&&j<R) { if (a[i]==bb[j]) i++; j++; } if (i==r) return true; return false; } bool haveAns(int i,int res,int hav) { if (hav==c) if (check()) return true; else return false; for (;i+res<=C;i++) { choose[i]=true; if (haveAns(i+1,res-1,hav+1)) return true; choose[i]=false; } return false; } int main() { int i,j; scanf("%d%d",&r,&c); for (i=0;i<r;i++) { int o=0; for (j=0;j<c;j++) { char x; scanf(" %c",&x); o=(o<<1)+(x-'0'); } a[i]=o; } memset(choose,0,sizeof(choose)); scanf("%d%d",&R,&C); for (i=0;i<R;i++) { for (j=0;j<C;j++) { char x; scanf(" %c",&x); b[i][j]=x-'0'; } } if (haveAns(0,c,0)) printf("Yes\n"); else printf("No\n"); return 0; }
相关文章推荐
- poj 3600 Subimage Recognition (枚举+dfs)
- POJ 3600 Subimage Recognition【递归DFS + 模拟枚举】
- POJ 3600 Subimage Recognition dfs
- POJ 3600 Subimage Recognition 搜索
- POJ 3600 Subimage Recognition(dfs)
- [POJ3600]Subimage Recognition(状态压缩,枚举,暴力)
- poj1042_贪心+枚举
- poj 1042 gone fishing 贪心+枚举
- [最小点割集]poj 1815 #贪心枚举
- poj 2586 Y2K Accounting Bug——我感觉是枚举(分类是贪心)
- POJ 1042 钓鱼问题 贪心枚举及动态规划
- POJ 1042 Gone Fishing (枚举+贪心) [12#11#16 daily] #by Plato
- POJ 1042 钓鱼问题 贪心枚举及动态规划
- Y2K Accounting Bug POJ - 2586 (贪心+枚举)
- poj1018 枚举加贪心
- UVA 1030 - Image Is Everything(贪心枚举)
- poj 3674 枚举+贪心与搜索
- POJ 1018 Communication System (枚举+贪心)
- POJ 1042 Gone Fishing(贪心+枚举)
- poj 1018 Communication System(枚举+贪心)