http://acm.hust.edu.cn/vjudge/contest/view.action?cid=30744#problem/C
注意,这里每一行输入后面都有一个空格,我一开始用%c输入,一直WA,后来才改为%s输入。
我用了一个p来存储小方块中每个点距离左上角第一个点的偏移位置。这里大方块上得左上角一定会与小方块的左上角匹配,否则就无法由两块小方块组成。
PS:一开始我用广搜的方法确定偏移位置,蛋疼了。然后就改成下面的方法,这样简单明了多好。
AC代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
char map1[12][12],map2[12][12];
int n,m,yn,nu,k;
struct node
{
int x,y;
};
node p[105];
int main()
{
int i,j,t,x,y;
int n1,n2;
int k;
while(scanf("%d%d",&n,&m)&&(n||m))
{
yn = nu = 0;
k = n1 = n2 = 0;
for(i = 0; i < n; i++)
{
scanf("%s",&map1[i]);
for(j = 0; j < n; j++)
{
if(map1[i][j]=='*')
{
n1++; //统计第一块*数量
}
}
}
p[0].x = p[0].y = 0; //设置第一个偏移为0
for(i = 0; i < m; i++)
{
scanf("%s",&map2[i]);
for(j = 0; j < m; j++)
{
if(map2[i][j]=='*')
{
n2++; //统计第二块*数量
p[k].x = i-p[0].x; //统计每个点距离最左上角的偏移距离
p[k].y = j-p[0].y;
k++;
}
}
}
p[0].x = p[0].y = 0; //重置第一个偏移为0;
if(n1==2*n2) //如果第一块*是第二块的2倍才有可能拼成
{
for(i = 0; i < n; i++)
{
for(j = 0; j < n; j++)
{
if(map1[i][j]=='*')
{
if(nu<2)
{
for(t = 0; t < k; t++) //按照每个点得位置查找并标记
{
x = i+p[t].x;
y = j+p[t].y;
if(map1[x][y]!='*') //如果不匹配直接退出
{
break;
}
map1[x][y] = '.';
}
if(t==k)
{
nu++;
}
if(nu==2)
{
yn = 1;
}
}
else
{
yn = 0;
break;
}
}
}
}
}
if(yn)
{
printf("1\n");
}
else
{
printf("0\n");
}
}
return 0;
}