POJ 3600 Subimage Recognition(dfs)

来源:互联网 发布:淘宝店铺封了怎么解封 编辑:程序博客网 时间:2024/05/22 14:15

Subimage Recognition


题意:r*c的01格子1,和R*C的01个格子2( <= 20),能否通过删除格子2的某些行和列使得格子1和格子2完全相同。


思路:暴力枚举删除某些列,然后观察是否完全匹配即可;


代码:

#include <cstdio>#include <iostream>#include <algorithm>using namespace std;char mp1[25][25], mp2[25][25];int a[25];int r, c, R, C; bool judge(){int id = 0, row = 1;while(id < R){int fnd = 0, i;for(i = id + 1; i <= R; i++){int flag = 1;for(int j = 0, col = 1; j < c; j++, col++){if(mp1[row][col] != mp2[i][a[j]]){flag = 0;break;}}if(flag)//此行匹配成功 {fnd = 1;break;}}if(!fnd)//到结束也没匹配成功     break;row++;id = i;}return row > r;} bool dfs(int index, int num){if(num == c) return judge();if(index > C) return false;//删除此列 if(dfs(index + 1, num)) return true;//不删除此列 a[num] = index;//记录所选列 if(dfs(index + 1, num + 1)) return true;return false;} int main(){while(cin>>r>>c){for(int i = 1; i <= r; i++)cin>>mp1[i];cin>>R>>C;for(int i = 1; i <= R; i++)cin>>mp2[i];puts(dfs(1, 0) ? "Yes" : "No");}return 0;}

原创粉丝点击