[东莞市2015年特长生] T3-糊涂的教授

题目描述

给出 N N 个矩形和 N N 个点,若一个点被一个矩形包含则表明这之间有关系

求一种方案为每个点都有一个对应的关系,且这种方案是唯一的。若没有或方案不唯一则输出"None"。

题目解析

N N 个矩形和 N N 个点之间有关系的连一条边,若其中一个矩阵唯一可以对应一个点,则和那个点相连,并把这对的点和矩阵擦掉。一直这样做到都匹配成功后就可以了。

若任意一个时刻,没有任何一个矩阵的入度为 1 1 则表明没有对应关系或方案不唯一,则输出"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]);
}

猜你喜欢

转载自blog.csdn.net/weixin_43909855/article/details/89412322