zoukankan      html  css  js  c++  java
  • 模拟赛 矩形框 题解

    题意:
    给出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;
    }
    
  • 相关阅读:
    千拣万拣,拣个烂灯盏
    在JavaScript中控制链接的点击
    一条SQL语句
    Atlas与页面缓存冲突造成报错问题
    猴子他爹
    没有源代码也可以调试
    IC卡
    郭昶
    在js脚本中找到控件
    郭昶来到咱们学车场
  • 原文地址:https://www.cnblogs.com/lnzwz/p/13118066.html
Copyright © 2011-2022 走看看