模拟赛 矩形框 题解

题意:
给出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;
}
原文地址:https://www.cnblogs.com/lnzwz/p/13118066.html