传送门: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‘); } }
原文地址:https://www.cnblogs.com/siuginhung/p/9172382.html
时间: 2024-10-15 08:55:08