Codeforces Round #487 (Div. 2) C - A Mist of Florescence

传送门:http://codeforces.com/contest/989/problem/C

这是一个构造问题。

构造一张网格,网格中的字符为’A’、’B’、’C’、’D’,并且其连通块的个数分别为a、b、c、d。

首先我们可以考虑两种颜色的情形:

构造一张网格,网格中的字符为’0’、’1’,并且其连通块的个数分别为a、b,其中a、b均为正整数。于是,至少为’0’、’1’分别构造一个连通块;再分别以连通块为“网”,植入’1’、’0’,植入时应保证植入的点互不连通。如下图所示:

以上构造法可以推广至四种颜色的情况。如下图所示:

参考程序如下:

#include <bits/stdc++.h>
using namespace std;

char g[50][50];

int main(void)
{
    int a, b, c, d;
    cin >> a >> b >> c >> d;
    cout << 50 << " " << 50 << endl;
    for (int i = 0; i < 25; i++) {
        for (int j = 0; j < 25; j++) g[i][j] = 'A';
        for (int j = 25; j < 50; j++) g[i][j] = 'B';
    }
    for (int i = 25; i < 50; i++) {
        for (int j = 0; j < 25; j++) g[i][j] = 'C';
        for (int j = 25; j < 50; j++) g[i][j] = 'D';
    }
    a--; b--; c--; d--;
    int x, y;
    x = 1; y = 1;
    while (d) {
        g[x][y] = 'D';
        y += 2;
        if (y >= 25) {
            y = 1;
            x += 2;
        }
        d--;
    }
    x = 1; y = 26;
    while (c) {
        g[x][y] = 'C';
        y+= 2;
        if (y >= 50) {
            y = 26;
            x += 2;
        }
        c--;
    }
    x = 26; y = 1;
    while (b) {
        g[x][y] = 'B';
        y += 2;
        if (y >= 25) {
            y = 1;
            x += 2;
        }
        b--;
    }
    x = 26; y = 26;
    while (a) {
        g[x][y] = 'A';
        y += 2;
        if (y >= 50) {
            y = 26;
            x += 2;
        }
        a--;
    }
    for (int i = 0; i < 50; i++) {
        for (int j = 0; j < 50; j++) putchar(g[i][j]);
        putchar('\n');
    }
}

猜你喜欢

转载自www.cnblogs.com/siuginhung/p/9172382.html