#用到了贪心方法。
#这个贪心刚开始想错了方法,后来想到了新的方法,AC
刚开始错在了按左端点升序排序并从左往右取最左端能取的格子,这个方法显然不能符合要求
比如下面这组数据:
2
1 1 3 3
1 1 3 3
2 2 2 2
错误代码:
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
struct note
{
int x1,x2,y1,y2,x,y;
int num;
} a[5010];
bool cmp1(note aa,note bb)
{
if(aa.x1!=bb.x1) return aa.x1<bb.x1;
else
return aa.x2<bb.x2;
}
bool cmp2(note aa,note bb)
{
if(aa.y1!=bb.y1) return aa.y1<bb.y1;
else
return aa.y2<bb.y2;
}
bool cmp3(note aa,note bb)
{
return aa.num<bb.num;
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
if(n==0) break;
memset(a,0,sizeof(a));
for(int i=0; i<n; i++)
{
int a1,b1,a2,b2;
scanf("%d%d%d%d",&a1,&b1,&a2,&b2);
a[i].num=i;
a[i].x1=a1;
a[i].x2=a2;
a[i].y1=b1;
a[i].y2=b2;
}
int flag=1;
sort(a,a+n,cmp1);
for(int i=0; i<n; i++)
{
if(a[i].x1<=i+1&&a[i].x2>=i+1) a[i].x=i+1;
else
{
flag=0;
break;
}
}
if(flag!=0)
{
sort(a,a+n,cmp2);
for(int i=0; i<n; i++)
{
if(a[i].y1<=i+1&&a[i].y2>=i+1) a[i].y=i+1;
else
{
flag=0;
break;
}
}
}
if(flag==0)
{
printf("IMPOSSIBLE\n");
}
else
{
sort(a,a+n,cmp3);
for(int i=0; i<n; i++)
{
printf("%d %d\n",a[i].x,a[i].y);
}
}
}
return 0;
}
后来换了方法,换成按右端点升序排序,从左往右取最左端能取的格子。这个方法用到了一个vis标记数组,不要忘记清零。
AC代码:
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
struct note
{
int x1,x2,y1,y2,x,y;
int num;
} a[5010];
int vis[5010];
bool cmp1(note aa,note bb)
{
if(aa.x2!=bb.x2) return aa.x2<bb.x2;
else
return aa.x1>bb.x1;
}
bool cmp2(note aa,note bb)
{
if(aa.y2!=bb.y2) return aa.y2<bb.y2;
else
return aa.y1>bb.y1;
}
bool cmp3(note aa,note bb)
{
return aa.num<bb.num;
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
if(n==0) break;
memset(a,0,sizeof(a));
for(int i=0; i<n; i++)
{
int a1,b1,a2,b2;
scanf("%d%d%d%d",&a1,&b1,&a2,&b2);
a[i].num=i;
a[i].x1=a1;
a[i].x2=a2;
a[i].y1=b1;
a[i].y2=b2;
}
int flag=1;
sort(a,a+n,cmp1);
memset(vis,0,sizeof(vis));
for(int i=0; i<n; i++)
{
int temp1=a[i].x1;
int temp2=a[i].x2;
int flag1=0;
for(int j=temp1; j<=temp2; j++)
{
if(!vis[j])
{
a[i].x=j;
flag1=1;
vis[j]=1;
break;
}
}
if(!flag1)
{
flag=0;
break;
}
}
memset(vis,0,sizeof(vis));
if(flag!=0)
{
sort(a,a+n,cmp2);
for(int i=0; i<n; i++)
{
int temp1=a[i].y1;
int temp2=a[i].y2;
int flag1=0;
for(int j=temp1; j<=temp2; j++)
{
if(!vis[j])
{
a[i].y=j;
flag1=1;
vis[j]=1;
break;
}
}
if(!flag1)
{
flag=0;
break;
}
}
}
if(flag==0)
{
printf("IMPOSSIBLE\n");
}
else
{
sort(a,a+n,cmp3);
for(int i=0; i<n; i++)
{
printf("%d %d\n",a[i].x,a[i].y);
}
}
}
return 0;
}