Round #322 (Div. 2) 581D Three Logos (模拟)

先枚举两个矩形,每个矩形横着放或竖着放,把一边拼起来,

如果不是拼起来有缺口就尝试用第三个矩形去补。

如果没有缺口就横着竖着枚举一下第三个矩形和合并的矩形x或y拼接。

#include<bits/stdc++.h>
using namespace std;
const int N = 300+5;
int ax[3][2],ay[3][2];
char g[N][N];

void print_a(int len,int k)
{
    printf("%d\n",len);
    int ch[] = {'C',k?'B':'A',k?'A':'B'};
    for(int i = 0; i < 2; i++){
        for(int x = ax[i][0]; x < ax[i][1]; x++){
            for(int y = ay[i][0]; y < ay[i][1]; y++){
                g[x][y] = ch[i];
            }
        }
    }
    for(int i = 0; i < len; i++){
        for(int j = 0; j < len; j++){
            if(!g[i][j]) putchar(ch[2]);
            else putchar(g[i][j]);
        }
        puts("");
    }
}

//#define LOCAL
int main()
{
#ifdef LOCAL
    freopen("in.txt","r",stdin);
#endif
    int x[3],y[3];
    for(int i = 0; i < 3; i++) {
        scanf("%d%d",x+i,y+i);
        //printf("%d %d\n",x[i],y[i]);
    }

    for(int i = 0; i <= 1; i++){
        int c = 2,j = i^1;
        while(c--){
            int ct2 = 2;
            while(ct2--){
                int xs = x[i]+x[2];
                int del = abs(y[2]-y[i]);
                if(del){
                    if(xs != max(y[2],y[i]))  { swap(x[i],y[i]); continue;}
                    int cx;
                    if(y[2] > y[i]) cx = x[i];
                    else cx = x[2];
                    int ct = 2;
                    while(ct--){
                        if(y[j] ==  del && x[j] == cx ){
                            ax[0][1] = x[2]; ay[0][1] = y[2];
                            ax[1][0] = x[2];
                            ax[1][1] = x[2]+x[i]; ay[1][1] = y[i];
                            print_a(xs,i);
                            return 0;
                        }
                        swap(x[j],y[j]);
                    }
                }else {
                    int ct = 2;
                    while(ct--){
                        if(x[j] == xs && y[i]+y[j] == xs){
                            ax[0][1] = x[2]; ay[0][1] = y[2];
                            ax[1][0] = x[2];
                            ax[1][1] = x[2]+x[i]; ay[1][1] = y[i];
                            print_a(xs,i);
                            return 0;
                        }
                        if(y[j] == y[i] && xs+x[j] == y[i]){
                            ax[0][1] = x[2]; ay[0][1] = y[2];
                            ax[1][0] = x[2];
                            ax[1][1] = x[2]+x[i]; ay[1][1] = y[i];
                            print_a(y[i],i);
                            return 0;
                        }
                        swap(x[j],y[j]);
                    }
                }
                swap(x[i],y[i]);
            }
            swap(x[2],y[2]);
        }
    }
    printf("-1\n");
    return 0;
}

 

转载于:https://www.cnblogs.com/jerryRey/p/4845055.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值