题目链接:UVA - 11134
题意描述:在一个n*n(1<=n<=5000)的棋盘上放置n个车,每个车都只能在给定的一个矩形里放置,使其n个车两两不在同一行和同一列,判断并给出解决方案。
算法分析:刚开始没有思路,后来看了别人的博客有了一点想法。我们把矩形的行和列分开解决,即n个车首先不能放置在同一行,然后判断n个车不能放置在同一列,如果都满足的话,即有正确的方法,否则就不行。那么怎样解决和判断在不在同一行并且是否可行呢,我们针对行而言,把这些行的坐标存入优先队列,首先取出最上面(行的标号较小)的,先放它,然后,再放下面的,依次往下撸就可以了。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cstdlib> 5 #include<cmath> 6 #include<algorithm> 7 #include<queue> 8 #define inf 0x7fffffff 9 using namespace std; 10 const int maxn=5000+10; 11 12 int n; 13 struct node 14 { 15 int l,r; 16 int id; 17 friend bool operator < (node a,node b) 18 { 19 if (a.l != b.l) return a.l > b.l ; 20 return a.r > b.r ; 21 } 22 }arr[maxn],arr2[maxn]; 23 int an[maxn][2]; 24 25 int solve(node *a,int pos) 26 { 27 priority_queue<node> Q; 28 for (int i=0 ;i<n ;i++) Q.push(a[i]); 29 int weizhi=0; 30 while (!Q.empty()) 31 { 32 node temp=Q.top() ;Q.pop() ; 33 if (temp.r<weizhi) return 0; 34 35 if (temp.l<weizhi) 36 { 37 temp.l=weizhi; 38 Q.push(temp); 39 continue; 40 } 41 int m=max(temp.l,weizhi); 42 an[temp.id ][pos]=m; 43 weizhi=m+1; 44 } 45 return 1; 46 } 47 48 int main() 49 { 50 while (scanf("%d",&n)!=EOF && n) 51 { 52 for (int i=0 ;i<n ;i++) 53 { 54 scanf("%d%d%d%d",&arr[i].l,&arr2[i].l,&arr[i].r,&arr2[i].r); 55 arr[i].id=arr2[i].id=i; 56 } 57 if (solve(arr,0) && solve(arr2,1)) 58 { 59 for (int i=0 ;i<n ;i++) 60 printf("%d %d ",an[i][0],an[i][1]); 61 } 62 else printf("IMPOSSIBLE "); 63 } 64 return 0; 65 }