「CodeForces 581D」Three Logos
BUPT 2017 Summer Training (for 16) #3A
题意
给你三个矩形,需要不重叠不留空地组成一个正方形。不存在输出-1,否则输出边长和这个正方形(A,B,C表示三个不同矩形)。
题解
我的做法是直接枚举三个是否旋转90度,然后考虑两种组成,|||和=|,枚举3的排列。
其实可以先计算面积s,如果r=sqrt(s)不是整数则无解。然后找到一个较长边为r的矩阵先输出,再输出剩下两个。
代码
#include <cstdio>
#include <algorithm>
using namespace std;
struct rec{
int w,h;
void in(){
scanf("%d%d",&w,&h);
}
void sw(){
swap(w,h);
}
}d[3];
void output(int a,int b,int c,int t){
int i,j;
if(t==1){
printf("%d\n",d[c].w);
for(i=0;i<d[c].h;++i){
for(j=0;j<d[c].w;++j)
putchar(c+'A');
puts("");
}
for(;i<d[c].w;++i){
for(j=0;j<d[a].w;++j)
putchar(a+'A');
for(;j<d[c].w;++j)
putchar(b+'A');
puts("");
}
}else{
printf("%d\n",d[a].w);
for(i=0;i<d[a].h;++i){
for(j=0;j<d[a].w;++j)
putchar(a+'A');
puts("");
}
for(i=0;i<d[b].h;++i){
for(j=0;j<d[b].w;++j)
putchar(b+'A');
puts("");
}
for(i=0;i<d[c].h;++i){
for(j=0;j<d[c].w;++j)
putchar(c+'A');
puts("");
}
}
}
bool ck(){
for(int i=0;i<3;++i)
for(int j=0;j<3;++j)
for(int k=0;k<3;++k)
if(i!=j&&j!=k&&k!=i){
if(d[i].w+d[j].w==d[k].w&&d[i].h==d[j].h&&d[i].h+d[k].h==d[k].w){
output(i,j,k,1);return true;
}
if(d[i].h+d[j].h+d[k].h==d[i].w&&d[i].w==d[j].w&&d[j].w==d[k].w){
output(i,j,k,2);return true;
}
}
return false;
}
bool solve(){
for(int i=0;i<2;++i,d[0].sw())
for(int j=0;j<2;++j,d[1].sw())
for(int k=0;k<2;++k,d[2].sw())
if(ck())return true;
return false;
}
int main(){
for(int i=0;i<3;++i)d[i].in();
if(!solve())puts("-1");
return 0;
}
┆凉┆暖┆降┆等┆幸┆我┆我┆里┆将┆ ┆可┆有┆谦┆戮┆那┆ ┆大┆始┆ ┆然┆
┆薄┆一┆临┆你┆的┆还┆没┆ ┆来┆ ┆是┆来┆逊┆没┆些┆ ┆雁┆终┆ ┆而┆
┆ ┆暖┆ ┆如┆地┆站┆有┆ ┆也┆ ┆我┆ ┆的┆有┆精┆ ┆也┆没┆ ┆你┆
┆ ┆这┆ ┆试┆方┆在┆逃┆ ┆会┆ ┆在┆ ┆清┆来┆准┆ ┆没┆有┆ ┆没┆
┆ ┆生┆ ┆探┆ ┆最┆避┆ ┆在┆ ┆这┆ ┆晨┆ ┆的┆ ┆有┆来┆ ┆有┆
┆ ┆之┆ ┆般┆ ┆不┆ ┆ ┆这┆ ┆里┆ ┆没┆ ┆杀┆ ┆来┆ ┆ ┆来┆