2013年11月2日 星期六

[USACO][Serch] 1-4-1 Packing Rectangles


/*
ID: 551100k1
LANG: C++
TASK: packrec
*/
#include<stdio.h>
#include<algorithm>
#include<vector>
using namespace std;
struct P{
    int x,y;
}s[5],t[5];
vector<P> vec;
int cmp(P a,P b){
    return a.x<b.x;
}
int ans=1e8,o[5],v[5]={0},r[5];
void dfs2(int k){
    if(k==4){
        int X,Y,i;
        for(i=0;i<4;i++)
            if(r[i]==0) t[i]=s[o[i]];
            else t[i].x=s[o[i]].y,t[i].y=s[o[i]].x;
        //1
        X=0,Y=0;
        for(i=0;i<4;i++)
            X+=t[i].x,Y=max(Y,t[i].y);
        if(X*Y==ans) vec.push_back((P){min(X,Y),max(X,Y)});
        if(X*Y<ans) ans=X*Y,vec.clear();
        //2
        X=0,Y=0;
        for(i=0;i<3;i++)
            X+=t[i].x,Y=max(Y,t[i].y+t[3].y);
        X=max(X,t[3].x);
        if(X*Y==ans) vec.push_back((P){min(X,Y),max(X,Y)});
        if(X*Y<ans) ans=X*Y,vec.clear();
        //3
        X=0,Y=0;
        for(i=0;i<2;i++)
            X+=t[i].x,Y=max(Y,t[i].y+t[3].y);
        X+=t[2].x;X=max(X,t[3].x+t[2].x);Y=max(Y,t[2].y);
        if(X*Y==ans) vec.push_back((P){min(X,Y),max(X,Y)});
        if(X*Y<ans) ans=X*Y,vec.clear();
        //4
        X=0,Y=0;
        X=t[0].x+t[3].x+max(t[1].x,t[2].x);
        Y=max(max(t[0].y,t[3].y),t[1].y+t[2].y);
        if(X*Y==ans) vec.push_back((P){min(X,Y),max(X,Y)});
        if(X*Y<ans) ans=X*Y,vec.clear();
        //5
        if(t[1].y>=t[0].y && t[2].x<=t[0].x && t[0].y<=t[1].y){
            X=0,Y=0;
            X=max(t[0].x+t[1].x,t[2].x+t[3].x);
            Y=max(t[0].y+t[2].y,t[1].y+t[3].y);
            if(X*Y==ans) vec.push_back((P){min(X,Y),max(X,Y)});
            if(X*Y<ans) ans=X*Y,vec.clear();
        }
        return;
    }
    r[k]=0,dfs2(k+1);
    r[k]=1,dfs2(k+1);
}
void dfs(int k){
    int i;
    if(k==4){
        dfs2(0);
        return;
    }
    for(i=0;i<4;i++)
        if(v[i]==0)
            v[i]=1,o[k]=i,dfs(k+1),v[i]=0;
}
int main(){
    freopen("packrec.in","r",stdin);
    freopen("packrec.out","w",stdout);
    int i;
    for(i=0;i<4;i++)
        scanf("%d%d",&s[i].x,&s[i].y);
    dfs(0);
    printf("%d\n",ans);
    sort(vec.begin(),vec.end(),cmp);
    for(i=0;i<vec.size();i++)
        if(!i || vec[i].x>vec[i-1].x)
        printf("%d %d\n",vec[i].x,vec[i].y);
}

沒有留言:

張貼留言