题意是给一个母图,再给一个子图,看看母图是否可以刚好由两个子图构成,注意是 刚好两个,而且子图不能翻转 只能平移,一开始就觉得用深搜做比较好但是对于建图觉得很烦躁,想了很久,看到 n,m的范围,所以应该建图建的暴力一点,x:-m 到n ,y:-m到n,这样左右上下平移就没有问题了,接下来 直接亮代码,写的可能不是很节俭,凑合着看吧,顺便送了几个案例
#include<iostream>
#include<cstdio>
#include<list>
#include<algorithm>
#include<cstring>
#include<string>
#include<queue>
#include<stack>
#include<map>
#include<vector>
#include<cmath>
#include<memory.h>
#include<set>
#define ll long long
#define LL __int64
const ll INF=9999999999999;
using namespace std;
#define M 400000100
#define inf 0xfffffff
//vector<int,int> G[20002];
//vector<pair<int,int>> ::iterator iter;
//map<ll,int>mp;
//map<ll,int>::iterator p;
int mp[12][12];
int tmp[12][12];
int vis[12*12];
char s[12];
int n,m;
void clear()
{
memset(vis,0,sizeof(vis));
memset(mp,0,sizeof(mp));
memset(tmp,0,sizeof(tmp));
}
int dfs(int mark)
{
if(mark==2)
return 1;
for(int i=-m;i<n;i++)
{
for(int j=-m;j<n;j++)
{
bool flag=false;
for(int k=0;k<m;k++)
{
for(int l=0;l<m;l++)
{
if(tmp[k][l]==1)
{
if((k+i<0 || i>=n || l+j<0 || l>=n) || mp[k+i][l+j]!=1)
flag=true;;
}
}
}
if(flag)
continue;
for(int k=0;k<m;k++)
{
for(int l=0;l<m;l++)
{
if(tmp[k][l]==1)
mp[k+i][l+j]=0;
}
}
if(dfs(mark+1))
return 1;
for(int k=0;k<m;k++)
{
for(int l=0;l<m;l++)
{
if(tmp[k][l]==1)
{
mp[i+k][j+l]=1;
}
}
}
}
}
return 0;
}
int main(void)
{
while(scanf("%d %d",&n,&m),n+m)
{
clear();
int len1,len2;
int mark1=0;
for(int i=0;i<n;i++)
{
scanf("%s",s);
for(int j=0;j<n;j++)
{
if(s[j]=='*')
{
mark1++;
mp[i][j]=1;
}
else
mp[i][j]=0;
}
}
int mark2=0;
for(int i=0;i<m;i++)
{
scanf("%s",s);
for(int j=0;j<m;j++)
{
if(s[j]=='*')
{
mark2++;
tmp[i][j]=1;
}
else
tmp[i][j]=0;
}
}
if(mark1!=2*mark2)
puts("0");
else
{
int ans=dfs(0);
if(ans)
puts("1");
else
puts("0");
}
}
}
/*
6 6
******
******
******
******
******
******
******
******
******
******
******
******
4 3
.*.
**.
***
**.
*..
*..
**.
4 3
.**.
****
.**.
....
**.
.**
...
3 3
***
*.*
***
*..
*..
**.
4 2
****
....
....
....
*.
*.
6 3
******
******
******
******
******
******
***
***
***
6 3
***...
***...
***...
..***.
..***.
..***.
***
***
***
6 3
***...
***...
*****.
..***.
..***.
......
***
***
***
6 4
***...
***...
***...
...***
...***
...***
....
.***
.***
.***
6 4
***...
***...
***...
...***
...***
*..***
....
.***
.***
.***
4 2
****
....
....
....
**
..
4 2
*...
*...
*...
*...
*.
*.
*/