cf487div2 C. A Mist of Florescence(构造法)

传送门

题意:

给定A,B,C,D的联通块个数,构造一个符合的图

题解:

这道题使用构造法,就是构造一个东西因为数据范围为1<=a,b,c,d<=100,所以使用底色进行构造,可以把左上角设为B,右上角全部设为A,左下角设为D,右下角设为C,然后进行构造,构造时选择好,不然有个小坑。


#include<bits/stdc++.h>

using namespace std;

const int maxn=50;

char g[maxn][maxn];

void push(char c,int sr,int er,int sc,int ec)
{
    for(int i=sr;i<er;i++){
        for(int j=sc;j<ec;j++){
            g[i][j]=c;
        }
    }
    return ;
}

int main()
{
    int a,b,c,d;
    scanf("%d%d%d%d",&a,&b,&c,&d);
    a--;
    b--;
    c--;
    d--;
    push('B',0,25,0,25);
    push('A',0,25,25,50);
    push('D',25,50,0,25);
    push('C',25,50,25,50);
    for(int i=0;i<25&&a;i++){
        for(int j=0;j<25&&a;j++){
            if(i%2&&j%2){
                g[i][j]='A';
                a--;
            }
        }
    }
    for(int i=0;i<25&&b;i++){
        for(int j=25;j<50&&b;j++){
            if(i%2==0&&j%2==0){
                g[i][j]='B';
                b--;
            }
        }
    }
    for(int i=25;i<50&&c;i++){
        for(int j=0;j<25&&c;j++){
            if(i%2&&j%2){
                g[i][j]='C';
                c--;
            }
        }
    }
    for(int i=25;i<50&&d;i++){
        for(int j=25;j<50&&d;j++){
            if(i%2==0&&j%2==0){
                g[i][j]='D';
                d--;
            }
        }
    }
    printf("%d %d\n",50,50);
    for(int i=0;i<maxn;i++){
        for(int j=0;j<maxn;j++){
            printf("%c",g[i][j]);
        }
        printf("\n");
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/zhouzi2018/article/details/80669579