uva1504(模拟+暴力)

来源:互联网 发布:美化状态栏的软件 编辑:程序博客网 时间:2024/06/05 07:31

题意:

给出第一象限的n个矩形的左下角坐标和右上角坐标,我们先把所有矩形向下移动,直至所有矩形都不能移动,然后把所有矩形都向左移动,直至所有矩形都不能移动,如此往复,直至所有矩形都不能移动,问最后所有矩形能覆盖到的x和y的最大值。


思路:

最开始以为是线段树,不知道该怎么写,而且巨麻烦,后来旁边的丧失说暴力。。。暴力!!!

那就暴力吧,我们每次对所有矩形进行移动的时候先对矩形进行排序,第一次移动按y排序,第二次按x排序,第三次按y排序。。。如此往复,直到所有矩形都不能动,输出答案即可。


代码:

#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#include<queue>#include<vector>#include<map>#include<stack>#include<cmath>#include<cstdlib>#include<climits>#include<sstream>using namespace std;struct REC{int x1,x2,y1,y2;}rec[600];int cmp1(REC a,REC b){if(a.y1==b.y1)return a.x1<b.x1;return a.y1<b.y1;}int cmp2(REC a,REC b){if(a.x1==b.x1)return a.y1<b.y1;return a.x1<b.x1;}int main(){int t;scanf("%d",&t);while(t--){int n;scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%d%d%d%d",&rec[i].x1,&rec[i].y1,&rec[i].x2,&rec[i].y2);rec[0].x1=0;rec[0].y1=0;rec[0].x2=0;rec[0].y2=0;for(int i=1;;i++){int flag=0;if(i%2){sort(rec,rec+1+n,cmp1);for(int j=1;j<=n;j++){int tx1=rec[j].x1;int tx2=rec[j].x2;//printf("x= %d %d\n",tx1,tx2);int ymax=0;for(int k=0;k<j;k++){int lx1=rec[k].x1;int lx2=rec[k].x2;if(lx1>=tx2||lx2<=tx1)continue;else ymax=max(ymax,rec[k].y2);}//printf("ymax= %d\n",ymax);int sub=rec[j].y1-ymax;//printf("sub= %d\n",sub);if(sub>0){rec[j].y1-=sub;rec[j].y2-=sub;flag=1;//puts("-------------1");}}}else{sort(rec,rec+1+n,cmp2);for(int j=1;j<=n;j++){int ty1=rec[j].y1;int ty2=rec[j].y2;int xmax=0;for(int k=0;k<j;k++){int ly1=rec[k].y1;int ly2=rec[k].y2;if(ly1>=ty2||ly2<=ty1)continue;else xmax=max(xmax,rec[k].x2);}int sub=rec[j].x1-xmax;if(sub>0){rec[j].x1-=sub;rec[j].x2-=sub;flag=1;//puts("-------------2");}}}//for(int j=1;j<=n;j++)//printf("%d %d %d %d\n",rec[j].x1,rec[j].y1,rec[j].x2,rec[j].y2);//puts("-----------------------------");if(flag==0)break;}int xmax=-1,ymax=-1;for(int i=1;i<=n;i++){xmax=max(xmax,rec[i].x2);ymax=max(ymax,rec[i].y2);}printf("%d %d\n",xmax,ymax);}return 0;}


0 0