多連塊拼圖 (湖南省第七屆大學生計算機程序設計競賽真題) (平移+模擬匹配)

多連塊拼圖

時間限制:1000 ms  |  內存限制:65535 KB
難度:4
描述
    多連塊是指由多個等大正方形邊與邊連接而成的平面連通圖形。         ———— 維基百科 

    給一個大多連塊和小多連塊,你的任務是判斷大多連塊是否可以由兩個這樣的小多連塊拼成。小多連塊只能平移,不能旋轉或者翻轉。兩個小多連塊不得重疊。左下圖是一個合法的拼法,但右邊兩幅圖都非法。中間那幅圖的問題在於其中一個小多連塊旋轉了,而右圖更離譜:拼在一起的那兩個多連塊根本就不是那個給定的小多連塊(給定的小多連塊畫在右下方)。 

輸入
輸入最多包含 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;
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章