~~~题目链接~~~
题目大意:给出一个图形,现要你判断 它是不是由2个基本图形(不能旋转))组合成的。
Ps:开始用递归进行模拟, 老是超时, 还是用队友的方法过吧。
code:
#include <iostream> #include <algorithm> #define inf 1234567890; using namespace std; int n = 0, m = 0, x1 = 0, x2 = 0, y1 = 0, y2 = 0; string m1[12], m2[12], m3[12], m4[12]; void print(string m1[12]) { for(int i = 0; i<n; i++) cout<<m1[i]<<endl; cout<<endl; } int cover(string m1[12], string m2[12], int x, int y) { for(int i = x, k = x1; k<=x2; i++, k++) { for(int j = y, l = y1; l<=y2; j++, l++) { if(m1[k][l] == '.') continue; if(m2[i][j] == '*' && m1[k][l] == '*') return 0; m2[i][j] = m1[k][l]; } } //print(m2); return 1; } void copy(string m1[12], string m2[12]) { for(int i = 0; i<n; i++) m2[i].assign(m1[i], 0, n); } void init() { for(int i = 0; i<n; i++) m3[i].assign(n, '.'); } int equal() { for(int i = 0; i<n; i++) if(m3[i] != m1[i]) return 0; return 1; } int main() { int i = 0, j =0, k = 0, l = 0, flag = 0; while(cin>>n>>m, n+m != 0) { for(i = 0; i<n; i++) cin>>m1[i]; for(i = 0; i<m; i++) cin>>m2[i]; x1 = inf; y1 = inf; x2 = 0; y2 = 0; for(i = 0; i<m; i++) for(j = 0; j<m; j++) { if(m2[i][j] == '*') { x1 = min(i, x1); x2 = max(i, x2); y1 = min(j, y1); y2 = max(j, y2); } } flag = 0; for(i = 0; i<n-x2+x1; i++) for(j = 0; j<n-y2+y1; j++) { init(); cover(m2, m3, i, j); copy(m3, m4); for(k = 0; k<n-x2+x1; k++) for(l = 0; l<n-y2+y1; l++) { copy(m4, m3); if(m3[k][l] == '.' && cover(m2, m3, k, l)) { if(equal()) { flag = 1; i = n, j = n, k = n, l = n; } } } } if(flag) cout<<1<<endl; else cout<<0<<endl; } return 0; }