*【拓扑(难度: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;
}