所有4个矩形块的边都与封闭矩形的边相平行,图1示出了铺放4个矩形块的6种方案。这6种方案仅只是可能的基本铺放方案。因为其它方案能由基本方案通过旋转和镜像反射得到。
可能存在满足条件且有着同样面积的各种不同的封闭矩形,你应该输出所有这些封闭矩形的边长。
解题算法
【模拟】
解题历程:
初看无思路
情况极多如乱麻
觉得用函数实现可能比较快
代码:
if(cnt==4)
{
if(x*y<sum)
{
memset(vis,0,sizeof(vis));
sum=x*y;
ans[ans[0]=1]=min(x,y);
vis[min(x,y)]=1;
}
else if(x*y==sum&&!vis[min(x,y)])
{
ans[++ans[0]]=min(x,y);
vis[min(x,y)]=1;
}
}
else
F(i,0,3)
if(!vit[i])
{
vit[i]=1;
//1
int xx=x+ex[i];
int yy=max(y,ey[i]);
dfs(xx,yy,cnt+1);
//2
xx=x+ey[i];
yy=max(y,ex[i]);
dfs(xx,yy,cnt+1);
//3
xx=max(x,ex[i]);
yy=y+ey[i];
dfs(xx,yy,cnt+1);
//4
xx=max(x,ey[i]);
yy=y+ex[i];
dfs(xx,yy,cnt+1);
vit[i]=0;
}
以上、
WA61
预料了...因为可以嵌进去的情况未考虑
所以分数很可观
然后无思路
瞎搞
代码:
num[0]=1;
F(i,1,6)
{
if(i<3)num[1]=2;
else if(i<5)num[1]=3;
else num[1]=4;
if(i==1||i==6)num[2]=3;
else if(i==2||i==4)num[2]=4;
else num[2]=2;
if(i==1||i==3)num[3]=4;
else if(i==2||i==5)num[3]=3;
else num[3]=2;
if(ex[num[0]]<=ey[num[1]]&&ex[num[1]]<=ey[num[2]]&&ey[num[3]]+ex[num[0]]<=ey[num[1]]+ex[num[2]])
{
int x=ex[num[2]]+ey[num[1]];
int y=max(ex[num[1]]+ey[num[0]],ey[num[2]]+ex[num[3]]);
if(x*y<sum)
{
memset(vis,0,sizeof(vis));
sum=x*y;
ans[ans[0]=1]=min(x,y);
vis[min(x,y)]=1;
}
else if(x*y==sum&&!vis[min(x,y)])
{
ans[++ans[0]]=min(x,y);
vis[min(x,y)]=1;
}
}
}
以上、
WA53
很明显是错的...水分也没水到
所以目前无思路
以上
2018.2.14