题目描述
给出 个矩形和 个点,若一个点被一个矩形包含则表明这之间有关系
求一种方案为每个点都有一个对应的关系,且这种方案是唯一的。若没有或方案不唯一则输出"None"。
题目解析
把 个矩形和 个点之间有关系的连一条边,若其中一个矩阵唯一可以对应一个点,则和那个点相连,并把这对的点和矩阵擦掉。一直这样做到都匹配成功后就可以了。
若任意一个时刻,没有任何一个矩阵的入度为 则表明没有对应关系或方案不唯一,则输出"None"即可
代码
#include<cstdio>
using namespace std;
struct point
{
int xl,yl,xr,yr;
}a[30];
int n,k;
int b[30][5],c[30][30],ans[30];
bool flag;
int main()
{
freopen("jiaoshou.in","r",stdin);
freopen("jiaoshou.out","w",stdout);
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d%d%d%d",&a[i].xl,&a[i].xr,&a[i].yl,&a[i].yr);
for(int i=1;i<=n;i++)
scanf("%d%d",&b[i][1],&b[i][2]);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(b[i][1]<=a[j].xr&&b[i][1]>=a[j].xl&&b[i][2]>=a[j].yl&&b[i][2]<=a[j].yr)
c[j][i]=1,c[j][0]++;
k=n;
while(k)
{
flag=1;
for(int i=1;i<=n;i++)
if(c[i][0]==1)
{
for(int j=1;j<=n;j++)
if(c[i][j])
ans[i]=j;
for(int j=1;j<=n;j++)
if(c[j][ans[i]]==1)
c[j][ans[i]]=0,c[j][0]--;
flag=0;
k--;
break;
}
if(flag)
{
printf("None");
return 0;
}
}
for(int i=1;i<=n;i++)
printf("%c %d\n",64+i,ans[i]);
}