糊涂的教授 计算几何+拓扑排序

糊涂的教授

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

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

数据输出 :

结果 输出到 名为 jiaoshou .out 的文本件。若是对应可以实现,你输出 文件应该包括 n行,每一为个字母和数中间以空格隔开并且 行,每一为个字母和数中间以空格隔开并且 行,每一为个字母和数中间以空格隔开并且 行,每一为个字母和数中间以空格隔开并且
- 4 -
各行以字母的升序排列,注意输出要大写并且顶格;反之若是对应无法 各行以字母的升序排列,注意输出要大写并且顶格;反之若是对应无法 各行以字母的升序排列,注意输出要大写并且顶格;反之若是对应无法 各行以字母的升序排列,注意输出要大写并且顶格;反之若是对应无法 实现,在文件的第一行顶格输出 None 即可。
行首末无多余空格输入出样例 输入出样例 输入出样例 1:
jiaoshou .in
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
jiaoshou .out
A 4
B 1
C 2
D 3
输入出样例 输入出样例 输入出样例 2:
jiaoshou .in
2
0 2
0 0 2
0 1 1
1
jiaoshou .out

None


题目大意:

  给出N个矩形和N个点,问每个点是否能唯一对应一个矩形,并输出方案。

题解:

  枚举出每个矩形包括的点(即点在矩形的横纵坐标范围内),做一次拓扑排序,若只有唯一方案即输出,否则输出None

const
  maxn=26;
  inf='jiaoshou.in';
  ouf='jiaoshou.out';
type
  arr1=array[1..maxn,1..4]of longint;
  arr2=array[1..maxn,1..2]of longint;
var
  a:array[1..maxn,1..4]of longint;
  b:array[1..maxn,1..2]of longint;
  n,i,j,p,k,l,l1:longint;
  ans:array[1..maxn,-1..maxn]of longint;
  f:array[1..maxn]of longint;
  so:array[1..maxn]of longint;

procedure init;
var
  i,j,x1,x2,y1,y2:longint;
begin
  readln(n);
  for i:=1 to n do
    readln(a[i,1],a[i,2],a[i,3],a[i,4]);
  for i:=1 to n do
    readln(b[i,1],b[i,2]);
end;

function check(i,j:longint):boolean;
begin
  if (b[j,1]>=a[i,1])and(b[j,1]<=a[i,2])and(b[j,2]>=a[i,3])and(b[j,2]<=a[i,4]) then exit(true);
  exit(false);
end;

begin
  assign(input,inf);reset(input);
  assign(output,ouf);rewrite(output);
  init;
  for i:=1 to n do
    for j:=1 to n do
      if check(i,j) then
      begin
        inc(ans[i,0]);
        ans[i,ans[i,0]]:=j;
        ans[i,-1]:=ans[i,0];
      end;
  p:=0;
  repeat
    inc(p);
    for i:=1 to n do
      if ans[i,-1]=1 then
        for j:=1 to ans[i,0] do
          if f[ans[i,j]]=0 then
          begin
            so[i]:=ans[i,j];
            f[ans[i,j]]:=1;
            for k:=1 to n do
              for l:=1 to ans[k,0] do
                if ans[k,l]=so[i] then dec(ans[k,-1]);
          end;
  until p=n;
  for i:=1 to n do
    if so[i]=0 then
    begin
      writeln('None');
      close(input);close(output);
      halt;
    end;
  for i:=1 to n do
    writeln(chr(65+i-1),' ',so[i]);
  close(input);close(output);
end.


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值