UVa 12291 Polyomino Composer

~~~題目鏈接~~~


題目大意:給出一個圖形,現要你判斷 它是不是由2個基本圖形(不能旋轉))組合成的。


Ps:開始用遞歸進行模擬, 老是超時, 還是用隊友的方法過吧。


code:


#include <iostream>
#include <algorithm>
#define inf 1234567890;
using namespace std;
int n = 0, m = 0, x1 = 0, x2 = 0, y1 = 0, y2 = 0;
string m1[12], m2[12], m3[12], m4[12];

void print(string m1[12])
{
    for(int i = 0; i<n; i++)
        cout<<m1[i]<<endl;
    cout<<endl;
}

int cover(string m1[12], string m2[12], int x, int y)
{
    for(int i = x, k = x1; k<=x2; i++, k++)
    {
        for(int j = y, l = y1; l<=y2; j++, l++)
        {
            if(m1[k][l] == '.') continue;
            if(m2[i][j] == '*'  && m1[k][l] == '*') return 0;
            m2[i][j] = m1[k][l];
        }
    }
    //print(m2);
    return 1;
}

void copy(string m1[12], string m2[12])
{
    for(int i = 0; i<n; i++)
        m2[i].assign(m1[i], 0, n);
}


void init()
{
    for(int i = 0; i<n; i++)
        m3[i].assign(n, '.');
}

int equal()
{
    for(int i = 0; i<n; i++)
        if(m3[i] != m1[i]) return 0;
    return 1;
}


int main()
{
    int i = 0, j =0, k = 0, l = 0, flag = 0;
    while(cin>>n>>m, n+m != 0)
    {
        for(i = 0; i<n; i++)
            cin>>m1[i];
        for(i = 0; i<m; i++)
            cin>>m2[i];
        x1 = inf;
        y1 = inf;
        x2 = 0;
        y2 = 0;
        for(i = 0; i<m; i++)
            for(j = 0; j<m; j++)
            {
                if(m2[i][j] == '*')
                {
                    x1 = min(i, x1);
                    x2 = max(i, x2);
                    y1 = min(j, y1);
                    y2 = max(j, y2);
                }
            }
        flag = 0;
        for(i = 0; i<n-x2+x1; i++)
            for(j = 0; j<n-y2+y1; j++)
            {
                init();
                cover(m2, m3, i, j);
                copy(m3, m4);
                for(k = 0; k<n-x2+x1; k++)
                    for(l = 0; l<n-y2+y1; l++)
                    {
                        copy(m4, m3);
                        if(m3[k][l] == '.' && cover(m2, m3, k, l))
                        {
                            if(equal())
                            {
                                flag = 1;
                                i = n, j = n, k = n, l = n;
                            }
                        }
                    }
            }
        if(flag) cout<<1<<endl;
        else cout<<0<<endl;
    }
    return 0;
}


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