模拟赛 矩形框 题解
Posted lnzwz
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了模拟赛 矩形框 题解相关的知识,希望对你有一定的参考价值。
题意:
给出n个矩形,求一个面积最小的矩形,使其能容纳这些矩形。
(n leq 6)。
首先,通过枚举排列,确定这n个矩形的排列顺序。
然后,按照这个顺序,以此放置每个矩形。
把第一个矩形放在左上角。
之后,枚举每个矩形x。为了使矩形尽量紧凑,这个矩形一定要紧挨在某个矩形y的右侧。
枚举这个矩形y。
为了使矩形不重叠,再枚举每个矩形z。
如果矩形x与z在横坐标上有交集,那么需要增大纵坐标来使其不重叠。
注意剪枝。
实际实现中,两次dfs可以合并为一次。
时间复杂度:约(O((n!)^2n))。实际可以跑出(n=8)。
代码:
#include <stdio.h>
int w[101],h[101],x[101],y[101],n,ans=99999999;
void dfs(int i,int W,int H,int p[101],bool bk[101])
{
if(W*H>=ans)
return;
if(i==n+1)
{
ans=W*H;
return;
}
for(int u=0;u<n;u++)
{
if(bk[u])continue;
p[i]=u;bk[u]=true;
for(int j=0;j<i;j++)
{
int a=p[j],tx=x[a]+w[a],ty=1;
for(int k=1;k<i;k++)
{
int b=p[k];
if(!(tx+w[u]<=x[b]||x[b]+w[b]<=tx)&&y[b]+h[b]>ty)
ty=y[b]+h[b];
}
x[u]=tx;y[u]=ty;
dfs(i+1,tx+w[u]-1>W?tx+w[u]-1:W,ty+h[u]-1>H?ty+h[u]-1:H,p,bk);
}
bk[u]=false;
}
}
int main()
{
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d%d",&w[i],&h[i]);
x[n]=y[n]=1;
int p[101]={n};bool bk[101]={0};
dfs(1,0,0,p,bk);
printf("%d",ans);
return 0;
}
以上是关于模拟赛 矩形框 题解的主要内容,如果未能解决你的问题,请参考以下文章