題目大意:給出一個圖形,現要你判斷 它是不是由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;
}