Codeforces Round #487 (Div. 2) C(脑洞构造题)

题意:给你4个数字a,b,c,d,让你构造出由A,B,C,D组成的图形,满足A的连通块儿数量等于a,B的连通块儿数量等于b,C的联通快数量等于c,D的联通快数量等于d。(其中凑成的矩形长宽都必须小于等于50)

a = 5 b = 3 c = 2 d = 1

给出的图可以是这样的


思路:

当时死都想不出来,结果赛后看了一张图 ,,,


真是优秀,,,解法就是长宽是50,50,之后分成4大块,之后在A的小方格里填D,D的小方格里填A,B填C,C填D就好了。

#include <bits/stdc++.h>
using namespace std;
char Map[55][55];
int main()
{
	int a,b,c,d;
	scanf("%d%d%d%d",&a,&b,&c,&d);
	puts("50 50");
	//分成4大块儿 
	for(int i = 0 ; i < 50 ; i++)
	{
		for(int j = 0 ; j < 50 ; j++)
		{
			if(i < 25) 
			{
				if(j<25) Map[i][j] = 'A';  // (0,0, 0 , 25) A 
				else Map[i][j] = 'B'; // (0,0, 25 ,50) B 
			}
			else 
			{
				if(j<25) Map[i][j] = 'C';  //不想写了。。。 
				else Map[i][j] = 'D';
			}
		}
		
	}
	a = a - 1; b = b - 1; c = c - 1 ; d = d - 1; //之后A,B,C,D数量-1, 
	for(int i = 0 ; i < 25 ; i++)
	{
		for(int j = 0 ; j < 25 ; j++)
		{
			if(d == 0) break;  //随便填 
			if(i%2 && j % 2)
			{
				Map[i][j] = 'D';
				d--;
			}
		}
	}
	for(int i = 0 ; i < 25 ; i++)
	{
		for(int j = 25 ; j < 50 ; j++)
		{
			if(c == 0) break;
			if(i%2 && j % 2)
			{
				Map[i][j] = 'C';
				c--;
			}
		}
	}
	for(int i = 25 ; i < 50 ; i++)
	{
		for(int j = 0 ; j < 25 ; j++)
		{
			if(b == 0) break;
			if(i%2 && j % 2)
			{
				Map[i][j] = 'B';
				b--;
			}
		}
	}
	for(int i = 25 ; i < 50 ; i++)
	{
		for(int j = 25 ; j < 50 ; j++)
		{
			if(a == 0) break;
			if(i%2 && j % 2)
			{
				Map[i][j] = 'A';
				a--;
			}
		}
	}
	for(int i = 0 ; i < 50 ; i++)
	{
		printf("%s\n",Map[i]);
	}
	return 0;
}

代码:




扫描二维码关注公众号,回复: 2043781 查看本文章

猜你喜欢

转载自blog.csdn.net/wjmwsgj/article/details/80662225