1. 程式人生 > >Codeforces Round #487 (Div. 2) C - A Mist of Florescence

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

至少 pan mes info enter test pre -- img

傳送門: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); } }

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