【拓扑】糊涂的教授

陈教授需要整理演讲幻灯片,将数字编号与字母编号对应。程序的任务是确保这种对应是唯一且可行的,输出字母和数字的对应关系,或者在无法实现时输出None。
摘要由CSDN通过智能技术生成

陈教授是一个国际知名的教授,很多单位都争先恐后邀请他演讲,今天下午陈教授就要做一个非常重要的演讲。由于陈教授年纪大了,对于一些不重要的小事情有点糊涂,今天上午他把自己做演讲要用的幻灯片随便堆放在一起。因此,演讲之前他不得不去整理这些幻灯片。由于时间很紧,他希望尽可能简单地完成它。情况是这样,陈教授这次演讲一共要用 n 张幻灯片(n<=26),这 n 张幻灯片按照演讲要使用的顺序已经用数字 1,2,…,n 在上面编上了号。因为幻灯片是透明的,所以我们不能一下子看清每一个数字所对应的幻灯片。
现在我们用大写字母 A,B,C,…再次把幻灯片依次编上号,你的任务是编写一个程序,把幻灯片的数字编号和字母编号对应起来,显然这种对应应该是唯一的;若是出现多种对应的情况或是某些数字编号和字母对应不起来,我们就称对应是无法实现的。

Input

文件第一行只有一个数n,表示有 n 张幻灯片,接下来的 n 行第行包括 4 个整数 Xmin,Xmax,Ymin,Ymax (整数之间用空格分开),为幻灯片的坐标,这 n 张幻灯片按其在输入文件中出现的顺序从前到后依次编号为 A,B,C,…再接下来的 n 行依次为 n 个数字编号的坐标 X,Y,显然在幻灯片之外是不会有数字的。

Output

若是对应可以实现,你的输出文件应该包括 n 行,每一行为一个字母和一个数字,中间以一个空格隔开,并且各行以字母的升序排列,注意输出的字母要大写并且顶格;反之,若是对应无法实现,在文件的第一行顶格输出 None 即可。行首行末无多余空格。


之前用匈牙利算法80分,没有计算不是唯一对应的情况。
详见代码

#include<cstdio>
#include<queue>
using namespace std;
queue<int> Q;
int n,x1[101],x2[101],y1[101],y2[101],l[101],F[101][101],xx,yy,Tt,t,b[101],k;
int main(){
	scanf("%d",&n);
	t=n;
	for(int i=1;i<=n;++i)     //读入
		scanf("%d%d%d%d",&x1[i],&x2[i],&y1[i],&y2[i]);
	for(int i=1;i<=n;++i){    
		scanf("%d%d",&xx,&yy);
		for(int j=1;j<=n;++j)   //往前找幻灯片
		  if(x1[j]<=xx&&x2[j]>=xx&&y1[j]<=yy&&y2[j]>=yy){  //这个点在幻灯片内
		  	F[i][j]=1;   //i点在j幻灯片内
		  	l[i]++;      //i点在的幻灯片数+1
		  }
	}
	while(t){   //匹配t数字/字母
		k=0;
		for(int i=1;i<=n;++i)   //轮点
		  if(l[i]==1){   //如果这个数字只剩一种选择
		  	for(int j=1;j<=n;++j)   //寻找字母
		  	  if(F[i][j]==1){
		  	  	  k=j;      //存下来
				  b[j]=i;   //记下答案
				  --t;      //删去一个数字
		  	  	  break;
		  	  }
		  	for(int j=1;j<=n;++j)  //枚举点删边
		  	  if(F[j][k]==1){  //跟刚刚的字母可以匹配
		  	  	  F[j][k]=0;
		  	  	  l[j]--;        //选择-1;
		  	  }
		  }
		if(k==0) {  //丝毫没改变
			printf("None");
			return 0;
		}
	}
	for(int i=1;i<=n;++i)  //输出
	  printf("%c %d\n",i+64,b[i]);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值