题意:给你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;
}
代码: