模擬賽 矩形框 題解

題意:
給出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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章