1.若sma(small中‘*’的个数)!=lar(large中'*'的个数),必不成立。
2.求出small的有效长height宽width,然后枚举i(0~n-height),j(0~n-width),找出第一个与small匹配的位置,并将其copy到origin数组,在找第二次的时候每找到与small匹配的位置都要与origin遍历一次看是否有重合,若没有即输出1。
代码如下:
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <cmath>
#include <set>
#include <iostream>
const double PI=acos(-1.0);
using namespace std;
typedef long long ll;
int main()
{
int n,m;
char large[12][12],small[12][12],origin[12][12];
while(~scanf("%d%d",&n,&m)&&n&&m) {
for(int i=0;i<n;i++) {
scanf("%s",large[i]);
}
for(int i=0;i<m;i++) {
scanf("%s",small[i]);
}
int lar=0,sma=0;
for(int i=0;i<n;i++) {
for(int j=0;j<n;j++) {
origin[i][j]='.';
if(large[i][j]=='*') {
lar++;
}
}
}
int minx=m,miny=m,maxx=0,maxy=0;
for(int i=0;i<m;i++) {
for(int j=0;j<m;j++) {
if(small[i][j]=='*') {
sma++;
if(minx>i) minx=i;
if(maxx<i) maxx=i;
if(miny>j) miny=j;
if(maxy<j) maxy=j;
}
}
}
int first=0,ans=0;
int height=maxx-minx+1;
int width=maxy-miny+1;
for(int ii=0;ii<=n-height;ii++) {
for(int jj=0;jj<=n-width;jj++) {
bool flag=true;
for(int i=0;i<height;i++) {
for(int j=0;j<width;j++) {
if(small[i+minx][j+miny]=='*'&&small[i+minx][j+miny]!=large[i+ii][j+jj]) {
flag=false;
}
}
}
if(flag&&first==0) {
for(int i=0;i<height;i++) {
for(int j=0;j<width;j++) {
origin[i+ii][j+jj]=small[i+minx][j+miny];
}
}
first=1;
}
else if(flag&&first) {
ans=1;
for(int i=0;i<m;i++) {
for(int j=0;j<m;j++) {
if(small[i][j]=='*'&&origin[i+ii][j+jj]=='*') {
ans=0;
}
}
}
if(ans!=0) break;
}
}
if(ans!=0) break;
}
if(ans==0||lar!=sma*2) {
printf("0\n");
}
else
printf("1\n");
}
return 0;
}
/*
4 3
**..
***.
.**.
....
**.
.**
...
4 3
.**.
****
.**.
....
**.
.**
...
3 3
***
*.*
***
*..
*..
**.
4 2
****
....
....
....
*.
*.
3 2
.**
.**
...
**
**
10 10
..*.......
..*.......
..*..*....
..*..*....
..*..*....
..*..*....
.....*....
.....*....
..........
..........
......*...
......*...
......*..*
.........*
.........*
..........
..........
..........
..........
..........
*/