CSU 1102 圖形匹配

B - 多連塊拼圖
Time Limit:1000MS     Memory Limit:131072KB     64bit IO Format:%lld & %llu

Description

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

Input

輸入最多包含20組測試數據。每組數據第一行爲兩個整數n和m(1<=m<=n<=10)。以下n行描述大多連塊,其中每行恰好包含n個字符*或者.,其中*表示屬於多連塊,.表示不屬於。以下m行爲小多連塊,格式同大多連塊。輸入保證是合法的多連塊(注意,多連塊至少包含一個正方形)。輸入結束標誌爲n=m=0。

Output

對於每組測試數據,如果可以拼成,輸出1,否則輸出0。 

Sample Input

4 3
.**.
****
.**.
....
**.
.**
...
3 3
***
*.*
***
*..
*..
**.
4 2
****
....
....
....
*.
*.
0 0 

Sample Output

1
0
0 
思路:判斷一個大的連塊拼圖能否由兩個小的相同的拼圖拼在一起;
瞎搞!
#include <iostream>
#include <stdio.h>
#include <string>
#include <string.h>
#include <algorithm>
using namespace std;

int n,m;
char s1[20][20]; //目標字符串
char s2[20][20]; //匹配字符串
int a,b;
int c,d;

void get_big()
{
  int flag=0;
  for(int i=0;i<n;i++)
  {
     for(int j=0;j<n;j++)
     {
         if(s1[i][j]=='*')
         {
            a=i;
            b=j;
            flag=1;
            break;
         }
     }
     if(flag)break;
  }
}

void get_small()
{
    int flag=0;
    for(int i=0;i<m;i++)
    {
      for(int j=0;j<m;j++)
      {
         if(s2[i][j]=='*')
         {
            c=i;
            d=j;
            flag=1;
            break;
         }
      }
      if(flag)break;
    }
}

bool check()
{
   for(int i=0;i<n;i++)
    for(int j=0;j<n;j++)
    {
       if(s1[i][j]=='*')return false;
    }
  return true;
}

int solve()
{
   get_small();
   while(!check())
   {
      get_big();
      for(int i=c;i<m;i++)
        for(int j=0;j<m;j++)
        {
             if(s2[i][j]=='*') //開始匹配
             {
                 if(s1[i-c+a][j-d+b]=='*')
                 {
                     s1[i-c+a][j-d+b]='.';
                 }
                 else
                    return 0;
             }
        }
   }
   return 1;
}

int main()
{
   while(scanf("%d%d",&n,&m)!=EOF)
   {
       if(n==0 && m==0)break;
       for(int i=0;i<n;i++)scanf("%s",s1[i]);
       for(int i=0;i<m;i++)scanf("%s",s2[i]);
       int ans=solve();
       cout<<ans<<endl;
   }
   return 0;
}


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