糊涂的教授

题目描述
陈教授是一个国际知名的教授,很多单位都争先恐后邀请他演讲,今天下午陈教授就要做一个非常重要的演讲。由于陈教授年纪大了,对于一些不重要的小事情有点糊涂,今天上午他把自己做演讲要用的幻灯片随便堆放在一起。因此,演讲之前他不得不去整理这些幻灯片。由于时间很紧,他希望尽可能简单地完成它。情况是这样,陈教授这次演讲一共要用 n 张幻灯片(n<=26),这 n 张幻灯片按照演讲要使用的顺序已经用数字 1,2,…,n 在上面编上了号。因为幻灯片是透明的,所以我们不能一下子看清每一个数字所对应的幻灯片。
现在我们用大写字母 A,B,C,…再次把幻灯片依次编上号,你的任务是编写一个程序,把幻灯片的数字编号和字母编号对应起来,显然这种对应应该是唯一的;若是出现多种对应的情况或是某些数字编号和字母对应不起来,我们就称对应是无法实现的。
输入
文件第一行只有一个数n,表示有 n 张幻灯片,接下来的 n 行第行包括 4 个整数 Xmin,Xmax,Ymin,Ymax (整数之间用空格分开),为幻灯片的坐标,这 n 张幻灯片按其在输入文件中出现的顺序从前到后依次编号为 A,B,C,…再接下来的 n 行依次为 n 个数字编号的坐标 X,Y,显然在幻灯片之外是不会有数字的。
输出
若是对应可以实现,你的输出文件应该包括 n 行,每一行为一个字母和一个数字,中间以一个空格隔开,并且各行以字母的升序排列,注意输出的字母要大写并且顶格;反之,若是对应无法实现,在文件的第一行顶格输出 None 即可。行首行末无多余空格。
输入样例
4
6 22 10 20
4 18 6 16
8 20 2 18
10 24 4 8
9 15
19 17
11 7
21 11

输出样例
A 4
B 1
C 2
D 3

.
.
.
.
.
.
分析
我貌似用了暴力,但好像普遍都用了拓扑排序,还有打了匹配的

.
.
.
.
.
程序:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;

int c[30][30],ans[30],q[1000],head=1,tail=1,tj[30];

struct edge
{
	int x1,x2,y1,y2;
}a[30];

int main()
{
	freopen("jiaoshou.in","r",stdin);
	freopen("jiaoshou.out","w",stdout);
	int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    	scanf("%d%d%d%d",&a[i].x1,&a[i].x2,&a[i].y1,&a[i].y2);
    for (int i=1;i<=n;i++)
    {
    	int x,y;
        scanf("%d%d",&x,&y);
        for (int j=1;j<=n;j++)
			if (x>a[j].x1&&x<a[j].x2&&y>a[j].y1&&y<a[j].y2)
            {  
				tj[i]++;
               	c[i][j]=1;
			}
	}
	int wq=0;
    for (int i=1;i<=n;i++)
    {   
		if (tj[i]==0) return false; else 
		if (tj[i]==1)
        {
			q[tail++]=i;
			wq=1;
		} 
    }
	while (head!=tail)
    {
    	int u=q[head++],t;
        for (int i=1;i<=n;i++)
            if (c[u][i]==1)
             {
               ans[i]=u;
			   t=i;
             }
    	for (int i=1;i<=n;i++)
            if (c[i][t]==1)
            {
                c[i][t]=0;
                tj[i]--;
                if (tj[i]==1) q[tail++]=i;
            }
     }
     int bz=0;
     for (int i=1;i<=n;i++)
	 	if (q[i]) bz=0; else
	 	{
	 		bz=1;
	 		break;
	 	} 
    if (bz==0) 
	{
		 for (int i=1;i<=n;i++)
    		printf("%c %d
",i+'A'-1,ans[i]);
	} else printf("None");
	fclose(stdin);
	fclose(stdout);
    return 0;
}
原文地址:https://www.cnblogs.com/YYC-0304/p/11094931.html