#P1619. *【拓扑(难度:4)】烦人的幻灯片

*【拓扑(难度:4)】烦人的幻灯片

Description

【题意】 
    有n(n≤26)张方形纸片放二维坐标系中,每张纸片有大写字母编号(A,B,C…)和数字编号(1~n)。 
    现在给出n个大写字母所在纸片的坐标和n个数字的坐标,显然在纸片之外是不会有数字的。 
    要求把纸片的字母编号和数字编号对应起来,显然这种对应应该是唯一的;
    若出现多种对应的情况或是某些数字编号和字母编号对应不起来,我们称对应是无法实现的。 
【输入格式】 
    第一行一个整数n。
    接下来的n行,每行包括4个整数xmin,xmax,ymin,ymax(整数之间用空格分开),依次为大写字母A,B,C…所在纸片的坐标。
    再接下来的n行,依次为数字1,2,3…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

Hint



#include<bits/stdc++.h>
using namespace std;
struct node{int lx,rx,ly,ry;}a[110];
int x[110],y[110],ys[110],cd[110];
bool Map[110][110];
int main()
{
    int n;scanf("%d",&n);
    for(int i=1;i<=n;i++)scanf("%d%d%d%d",&a[i].lx,&a[i].rx,&a[i].ly,&a[i].ry);
    for(int i=1;i<=n;i++)scanf("%d%d",&x[i],&y[i]);
	memset(cd,0,sizeof(cd));
	memset(Map,0,sizeof(Map));
    for(int i=1;i<=n;i++)//i表示纸片A、B… 
        for(int j=1;j<=n;j++)//j表示数字1-n 
            if(a[i].lx<=x[j]&&x[j]<=a[i].rx&&a[i].ly<=y[j]&&y[j]<=a[i].ry)
				Map[i][j]=1,cd[i]++;
    for(int i=1;i<=n;i++)if(cd[i]==0){printf("None\n");return 0;}
    for(int t=1;t<=n;t++)
    {
        int x=0;
        for(int i=1;i<=n;i++)if(cd[i]==1){x=i;break;} //找到只有一个出度的字母 
        if(x==0){printf("None\n");return 0;}
        int y=0;
        for(int j=1;j<=n;j++)if(Map[x][j]){y=j;break;}//找到x对应的数字y 
        ys[x]=y;//字母x对应数字y 
        for(int i=1;i<=n;i++)if(Map[i][y])cd[i]--,Map[i][y]=0;//所有范围包含y的纸片的出度减一 
    }
    for(int i=1;i<=n;i++)printf("%c %d\n",i+'A'-1,ys[i]);
    return 0;
}