uva11134 贪心 回溯必tle 规模5000

行和列分别考虑,找出右端点中最靠左,左端点最靠右的,必然是最优方案

#include<iostream>
#include<vector>
#include<stdio.h>
#include<cstring>
#include<algorithm>
using namespace std;
struct Rectangle
{
    int x1,y1,x2,y2;
    int x,y;
    int order;
} rec[5010];
int n;
int row[5010],col[5010];
/*void Search(int num)
{
    if(flag==0)
        return;
    if(num==n)
    {
        flag=0;
        tot++;
        for(int i=0; i<n; i++)
        {
            printf("%d %d\n",poi[i].x,poi[i].y);
        }
    }
    else
    {
        for(int i=0; i<n; i++)
        {
            for(int j=rec[num].x1; j<=rec[num].x2; j++)
            {
                if(!visit[0][j])
                {
                    visit[0][j]=1;
                    for(int k=rec[num].y1; k<=rec[num].y2; k++)
                    {
                        if(!visit[1][k])
                        {
                            poi[num].x=j;
                            poi[num].y=k;
                            visit[1][k]=1;
                            Search(num+1);
                            visit[1][k]=0;
                        }
                        /* poi[num].x=j;
                         poi[num].y=k;
                         int ok=1;
                         for(int j=0; j<num; j++)
                         {
                             if(poi[num].x==poi[j].x||poi[num].y==poi[j].y)
                             {
                                 ok=0;
                                 break;
                             }
                         }* /
                         if(ok) Search(num+1);
                    }
                    visit[0][j]=0;
                }
            }
        }
    }
}*/
bool cmp1(Rectangle a,Rectangle b)
{
    if(a.x2!=b.x2)
        return a.x2<b.x2;
    return a.x1>=b.x1;
}
bool cmp2(Rectangle a,Rectangle b)
{
    if(a.y2!=b.y2)
        return a.y2<b.y2;
    return a.y1>=b.y1;
}
bool cmp3(Rectangle a,Rectangle b)
{
    return a.order<b.order;
}
bool Col()
{
     sort(rec,rec+n,cmp1);
        for(int i=0;i<n;i++)
        {
            bool flag=false;
            for(int j=rec[i].x1;j<=rec[i].x2;j++)
            {
                if(col[j]==0)
                {
                    col[j]=1;
                    flag=true;
                    rec[i].x=j;
                    break;

                }
            }
            if(!flag)
            {
                return false;
            }
        }
        return true;
}
bool Row()
{
     sort(rec,rec+n,cmp2);
        for(int i=0;i<n;i++)
        {
            bool flag=false;
            for(int j=rec[i].y1;j<=rec[i].y2;j++)
            {
                if(row[j]==0)
                {
                    row[j]=1;
                    flag=true;
                    rec[i].y=j;
                    break;

                }
            }
            if(!flag)
            {
                return false;
            }
        }
        return true;
}
int main()
{
    while(scanf("%d",&n)&&n!=0)
    {
        memset(col,0,sizeof(col));
        memset(row,0,sizeof(row));
        for(int i=0; i<n; i++)
        {
            scanf("%d%d%d%d",&rec[i].x1,&rec[i].y1,&rec[i].x2,&rec[i].y2);
            rec[i].order=i;
        }
       if(!Col())
       {
           puts("IMPOSSIBLE1");
           continue;
       }
       if(!Row())
       {
           puts("IMPOSSIBLE2");
           continue;
       }
       sort(rec,rec+n,cmp3);
       for(int i=0;i<n;i++)
       {
           printf("%d %d\n",rec[i].x,rec[i].y);
       }

    }
    return 0;
}
View Code

 

posted @ 2014-10-30 16:19  名牌果果  阅读(114)  评论(0编辑  收藏  举报