题意比较麻烦,其实就是给你n个矩形的坐标(这样能确定矩形的范围),然后给你n个点,问这些点部分或全部是否能够唯一确定在某矩形中(满足不冲突)。我用的拓扑排序做的,也就是说如果当前能够确定某个矩形内只能有某点或者说某点只能在某矩形中,那么这个点就能够被确定。
代码:
#include<cstdio> #include<cstring> #include<iostream> using namespace std; const int maxn=50; struct Node { int x1; int y1; int x2; int y2; }a[maxn]; int n,cnt[maxn],cntx[maxn],ans[maxn],x[maxn],y[maxn]; bool vis[maxn]; bool IsIn(int x,int y,int i) { if(x>=min(a[i].x1,a[i].x2)&&x<=max(a[i].x1,a[i].x2)&&y>=min(a[i].y1,a[i].y2)&&y<=max(a[i].y1,a[i].y2)) return true; return false; } int main() { int cas=1; while(scanf("%d",&n)&&n) { memset(cnt,0,sizeof(cnt)); memset(cntx,0,sizeof(cntx)); memset(ans,0,sizeof(ans)); memset(vis,0,sizeof(vis)); for(int i=0;i<n;i++) scanf("%d%d%d%d",&a[i].x1,&a[i].x2,&a[i].y1,&a[i].y2); for(int i=0;i<n;i++) { scanf("%d%d",&x[i],&y[i]); for(int j=0;j<n;j++) if(IsIn(x[i],y[i],j)) { cnt[j]++; cntx[i]++; } } for(int i=0;i<n;i++) { int pos=-1; for(int j=0;j<n;j++) if(cnt[j]==1) { pos=j; break; } if(pos!=-1) { for(int j=0;j<n;j++) { if(!vis[j]&&IsIn(x[j],y[j],pos)) { ans[pos]=j+1; vis[j]=1; for(int k=0;k<n;k++) if(IsIn(x[j],y[j],k)) cnt[k]--; break; } } continue; } for(int j=0;j<n;j++) if(cntx[j]==1) { pos=j; break; } if(pos==-1) break; for(int j=0;j<n;j++) if(!ans[j]&&IsIn(x[pos],y[pos],j)) { ans[j]=pos+1; vis[pos]=1; for(int k=0;k<n;k++) if(IsIn(x[k],y[k],j)) cntx[k]--; break; } } if(cas>1) printf("\n"); printf("Heap %d\n",cas++); bool is=true; for(int i=0;i<n;i++) if(ans[i]) { is=false; break; } if(is) { printf("none\n"); continue; } is=false; for(int i=0;i<n;i++) if(ans[i]) { if(is) printf(" (%c,%d)",'A'+i,ans[i]); else { printf("(%c,%d)",'A'+i,ans[i]); is=true; } } printf("\n"); } return 0; }