(构造)【CF 989C】C. A Mist of Florescence

本文分享了一道CodeForces C题目的解题思路及代码实现。通过巧妙构造图形来解决字符联通块的问题,适用于数据范围内的特定条件。文中详细介绍了如何通过预先设定的字符布局并填充剩余字符的方法来达成题目要求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这个逻辑题。。真是有点蠢,没经验,数据都不看仔细就瞎敲代码了,算是长记性了。

给四个数字,分别是字符A、B、C、D的联通块的个数,但是数据范围给出的是每个字符的联通块最多也就100个,加起来400个。n和m的范围却是1到50,所以直接构造一个很大的图,中间弄出分隔的一小块用来填充字符就好了。

当晚我是没想到,过了两天想了个构造,应该还算好敲的。先构造出下图这样的,‘X'代表可以用来填充其他字符的位置,其他的就是固定了的字符。然后再将a、b、c、d的数量-1(因为填充下面这个构造图就已经出现了一个联通块),再分别将'A' 'B' 'C' 'D'分别填充在1~8,9~16,17~24,25~32行中的'X'位置。

32 50
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
XCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXC
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
XCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXC
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
XCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXC
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
XCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXC
DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
XDXDXDXDXDXDXDXDXDXDXDXDXDXDXDXDXDXDXDXDXDXDXDXDXD
DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
XDXDXDXDXDXDXDXDXDXDXDXDXDXDXDXDXDXDXDXDXDXDXDXDXD
DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
XDXDXDXDXDXDXDXDXDXDXDXDXDXDXDXDXDXDXDXDXDXDXDXDXD
DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
XDXDXDXDXDXDXDXDXDXDXDXDXDXDXDXDXDXDXDXDXDXDXDXDXD
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
XAXAXAXAXAXAXAXAXAXAXAXAXAXAXAXAXAXAXAXAXAXAXAXAXA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
XAXAXAXAXAXAXAXAXAXAXAXAXAXAXAXAXAXAXAXAXAXAXAXAXA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
XAXAXAXAXAXAXAXAXAXAXAXAXAXAXAXAXAXAXAXAXAXAXAXAXA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
XAXAXAXAXAXAXAXAXAXAXAXAXAXAXAXAXAXAXAXAXAXAXAXAXA
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
XBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXB
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
XBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXB
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
XBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXB
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB

XBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXB


/*
* @Author: Samson
* @Date:   2018-06-11 22:23:03
* @Last Modified by:   Samson
* @Last Modified time: 2018-06-14 00:00:20
*/
//   @URL : http://codeforces.com/contest/989/problem/C
#include<bits/stdc++.h>
#include<algorithm>
#include <cstdlib>
#define INF 0x3f3f3f3f
using namespace std;
typedef long long LL;
const int MAXN = 1e5+10;

char ch[55][55];

void init(int row,char c)
{
	for(int i = row; i < 8+row; ++i)
	{
		for(int j = 1; j <= 50; ++j)
		{
			if(i%2 || j%2==0)
				ch[i][j] = c;
		}
	}
}

void fill_in(int row,char f,int num)
{
	char blank = ch[row][1];
	for(int i = row; i<8+row; ++i)
	{
		if(i%2)	continue;
		for(int j = 1; j<=50; j += 2)
		{
			if(!num)
				ch[i][j] = blank;
			else if(num--)
				ch[i][j] = f;
		}
	}
}
void print()
{
	printf("32 50\n");
	for(int i = 1; i <= 2*4*4; ++i)
	{
		for(int j = 1; j <= 50; ++j)
		{
			printf("%c", ch[i][j]);
		}
		printf("\n");
	}
}

int main(void)
{
	int a[5];
	char word[] = {'A','B','C','D'};
	while(~scanf("%d%d%d%d",&a[0],&a[1],&a[2],&a[3]))
	{
		memset(ch,0,sizeof ch);
		init(1,'C'), init(9,'D'), init(17,'A'), init(25,'B');
		for(int row = 1,i = 0; i < 4; row += 2*4,++i)
		{
			fill_in(row,word[i],a[i]-1);
		}
		print();
	}
	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值