糊涂的教授
Time Limit:10000MS Memory Limit:65536K
Total Submit:7 Accepted:1
Case Time Limit:1000MS
Description
陈教授是一个国际知名的教授,很多单位都争先恐后邀请他演讲,今天下午陈教授就要做一个非常重要的演讲。由于陈教授年纪大了,对于一些不重要的小事情有点糊涂,今天上午他把自己做演讲要用的幻灯片随便堆放在一起。因此,演讲之前他不得不去整理这些幻灯片。由于时间很紧,他希望尽可能简单地完成它。情况是这样,陈教授这次演讲一共要用 n 张幻灯片(n<=26),这 n 张幻灯片按照演讲要使用的顺序已经用数字 1,2,…,n 在上面编上了号。因为幻灯片是透明的,所以我们不能一下子看清每一个数字所对应的幻灯片。
现在我们用大写字母 A,B,C,…,再次把幻灯片依次编上号,你的任务是编写一个程序,把幻灯片的数字编号和字母编号对应起来,显然这种对应应该是唯一的;若是出现多种对应的情况或是某些数字编号和字母对应不起来,我们就称对应是无法实现的。
Input
幻灯片的情况通过一个文本文件 jiaoshou.in 输入。文件第一行只有一个数n,表示有 n 张幻灯片,接下来的 n 行第行包括 4 个整数 Xmin,Xmax,Ymin,Ymax
(整数之间用空格分开),为幻灯片的坐标,这 n 张幻灯片按其在输入文件中出现的顺序从前到后依次编号为 A,B,C,…,再接下来的 n 行依次为 n 个数字编号的坐标 X,Y,显然在幻灯片之外是不会有数字的。
Output
结果输出到名为 jiaoshou.out 的文本文件。若是对应可以实现,你的输出文件应该包括 n 行,每一行为一个字母和一个数字,中间以一个空格隔开,并且
各行以字母的升序排列,注意输出的字母要大写并且顶格;反之,若是对应无法
实现,在文件的第一行顶格输出 None 即可。行首行末无多余空格。
Sample Input
输入样例1
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
输入样例2
2
0 2 0 2
0 2 0 2
1 1
1 1
Sample Output
输出样例1
A 4
B 1
C 2
D 3
输出样例2
None
做法:把所有可以匹配的找出来构成图,然后拓扑排序
(关于为什么拓扑排序可以做参考拓扑排序解析:(http://blog.csdn.net/dm_vincent/article/details/7714519))
代码如下:
var
f:array[1..26,-1..26] of longint;
b:array[1..26] of boolean;
t:array[1..26] of longint;
x,y,xx,yy:array[1..26] of longint;
i,j,k,l,ans,n,q,p:longint;
procedure init;
var
i,j,k:longint;
begin
readln(n);
for i:=1 to n do
readln(x[i],xx[i],y[i],yy[i]);
for i:=1 to n do
begin
readln(q,p);
for j:=1 to n do
if (q>=x[j])and(p>=y[j])and(q<=xx[j])and(p<=yy[j]) then
begin
inc(f[j,0]);
f[j,f[j,0]]:=i;
f[j,-1]:=f[j,0];
end;
end;
end;
procedure print;
var
i:longint;
begin
for i:=1 to n do
writeln(chr(ord('A')-1+i),' ',t[i]);
end;
begin
init;
p:=0;
repeat
inc(p);
for i:=1 to n do
if f[i,-1]=1 then
begin
for j:=1 to f[i,0] do
if not b[f[i,j]] then
begin
b[f[i,j]]:=true;
t[i]:=f[i,j];
for k:=1 to n do
for l:=1 to f[k,0] do
if f[k,l]=t[i] then dec(f[k,-1]);
end;
end;
until p=n;
for i:=1 to n do
if t[i]=0 then begin writeln('None'); halt; end;
print;
end.