多連塊是指由多個等大正方形邊與邊連接而成的平面連通圖形。 ———— 維基百科
給一個大多連塊和小多連塊,你的任務是判斷大多連塊是否可以由兩個這樣的小多連塊拼成。小多連塊只能平移,不能旋轉或者翻轉。兩個小多連塊不得重疊。左下圖是一個合法的拼法,但右邊兩幅圖都非法。中間那幅圖的問題在於其中一個小多連塊旋轉了,而右圖更離譜:拼在一起的那兩個多連塊根本就不是那個給定的小多連塊(給定的小多連塊畫在右下方)。
-
輸入
- 輸入最多包含 20 組測試數據。每組數據第一行爲兩個整數 n 和 m(1<=m<=n<=10)。以下 n 行描述大多連塊,其中每行恰好包含 n 個字符*或者.,其中*表示屬於多連塊,.表示不屬於。以下 m 行爲小多連塊,格式同大多連塊。輸入保證是合法的多連塊(注意,多連塊至少包含一個正方形)。輸入結束標誌爲 n=m=0。
-
輸出
- 對於每組測試數據,如果可以拼成,輸出 1,否則輸出 0。
-
樣例輸入
-
4 3
.**.
****
.**.
....
**.
.**
...
3 3
***
*.*
***
*..
*..
**.
4 2
****
....
....
....
*.
*.
0 0
-
樣例輸出
-
1
0
0
-
來源
湖南省第七屆大學生計算機程序設計競賽
#include <iostream>
#include<string.h>
#include<stdio.h>
using namespace std;
char b[100][100],a[100][100],B[100][100],flag[100][100];
int n,m;
int h[9]= {-1,0,0,1},
l[9]= {0,1,-1,0};
void fz()
{
for(int i=0; i<n; i++)
for(int j=0; j<n; j++)
B[i][j]=a[i][j];
}
void xg()
{
for(int i=0; i<n; i++)
for(int j=0; j<n; j++)
a[i][j]=B[i][j];
}
int aa(int x,int y,int X,int Y)
{
fz();
for(int i=0; i<m; i++)
for(int j=0; j<m; j++)
{
if(b[i][j]=='*')
if(B[i+X-x][j+Y-y]!='*')
return 0;
else
B[i+X-x][j+Y-y]='.';
}
xg();
return 1;
}
int dd(int x,int y)
{
for(int i=0; i<n; i++)
for(int j=0; j<n; j++)
if(b[i][j]=='*')
aa(x,y,i,j);
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
if(n==0&&m==0)break;
for(int i=0; i<n; i++)
scanf("%s",&a[i]);
for(int i=0; i<m; i++)
scanf("%s",&b[i]);
int lis=0;
for(int i=0; i<m&&lis==0; i++)
for(int j=0; j<m&&lis==0; j++)
if(b[i][j]=='*')
{
for(int i1=0; i1<n&&lis==0; i1++)
for(int j1=0; j1<n&&lis==0; j1++)
if(a[i1][j1]=='*')
if(aa(i,j,i1,j1)==1)lis++;
}
for(int i=0; i<m&&lis==1; i++)
for(int j=0; j<m&&lis==1; j++)
if(b[i][j]=='*')
{
for(int i1=0; i1<n&&lis==1; i1++)
for(int j1=0; j1<n&&lis==1; j1++)
if(a[i1][j1]=='*')
if(aa(i,j,i1,j1)==1)lis++;
}
if(lis==2)
printf("1\n");
else printf("0\n");
}
return 0;
}