模拟赛 矩形框 题解

题意:
给出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;
}
posted @ 2020-06-13 16:41  lnzwz  阅读(175)  评论(0编辑  收藏  举报