1. 程式人生 > >Uva 11134 Fabled Rooks(平面區間選點)

Uva 11134 Fabled Rooks(平面區間選點)

由於它是平面選點,可以將它確定矩形的對角座標x1,y1,x2,y2,,拆成x軸座標x1,y1 和y軸座標x2,y2;

然後分別對x軸和y軸區間選點,只要兩個都可以選完,那就說明在它確定的平面上也是可以選出的。需注意輸出時還要還原順序輸出。

import java.util.*;
class weizhi implements Comparable<weizhi>
{
	int x,y,id;
	public int compareTo(weizhi A)
	{
		if(this.y<A.y) return -1;
		else if(this.y>A.y) return 1;
		else 
		{
			if(this.x<A.x) return -1;
			else return 1;
		}
	}
}
public class Main 
{	public static int n,bzx[]=new int[5005],bzy[]=new int[5005];
	static weizhi zbx[]=new weizhi[5005],zby[]=new weizhi[5005],ans[]=new weizhi[5005];
	public static void main(String[] args) 
	{
		Scanner in=new Scanner(System.in);
		int i,j; boolean flag = true;
		while(in.hasNextInt())
		{
			n=in.nextInt();
			if(n==0) break;
			for(i=0;i<n;i++)
			{
				zbx[i]=new weizhi();
				zby[i]=new weizhi();
				zbx[i].x=in.nextInt();
				zby[i].x=in.nextInt();
				zbx[i].y=in.nextInt();
				zby[i].y=in.nextInt();
				zbx[i].id=i;  zby[i].id=i;
			}
			Arrays.sort(zbx,0,n);
			Arrays.sort(zby,0,n);
			
			for(i=0;i<5005;i++) {bzx[i]=0;bzy[i]=0;}
			for(i=0;i<n;i++)
			{   flag=true;
				for(j=zbx[i].x;j<=zbx[i].y;j++)
				{
					if(bzx[j]==0) {bzx[j]=1; zbx[i].y=zbx[i].id; zbx[i].x=j;flag=false; break;}
				}
				if(flag) {System.out.println("IMPOSSIBLE");break;}
				flag=true;
				for(j=zby[i].x;j<=zby[i].y;j++)
				{   
					if(bzy[j]==0) {bzy[j]=1; zby[i].y=zby[i].id; zby[i].x=j; flag=false; break;}
				}
				if(flag) {System.out.println("IMPOSSIBLE");break;}
			}
			if(!flag)
			{
				Arrays.sort(zbx,0,n); Arrays.sort(zby,0,n);
				for(i=0;i<n;i++)
				{
					System.out.println(zbx[i].x+" "+zby[i].x);
				}
			}
			
		}

	}

}