首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >「CodeForces 581D」Three Logos

「CodeForces 581D」Three Logos

作者头像
饶文津
发布2020-06-02 15:43:18
发布2020-06-02 15:43:18
3300
举报
文章被收录于专栏:饶文津的专栏饶文津的专栏

BUPT 2017 Summer Training (for 16) #3A

题意

给你三个矩形,需要不重叠不留空地组成一个正方形。不存在输出-1,否则输出边长和这个正方形(A,B,C表示三个不同矩形)。

题解

我的做法是直接枚举三个是否旋转90度,然后考虑两种组成,|||和=|,枚举3的排列。 其实可以先计算面积s,如果r=sqrt(s)不是整数则无解。然后找到一个较长边为r的矩阵先输出,再输出剩下两个。

代码

代码语言:javascript
复制
#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;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017-07-21 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题意
  • 题解
  • 代码
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档