zoukankan      html  css  js  c++  java
  • 拓扑排序——烦人的幻灯片

    烦人的幻灯片

    Description

    李教授于今天下午做一个非常重要的演讲。不幸的是他不是一个非常爱整洁的人,他把自己做演讲要用的幻灯片随便堆放在一起。因此,演讲之前他不得不去整理这些幻灯片。做为一个讲求效率的学者,他希望尽可能简单地完成它。情况是这样,教授这次演讲一共要用n张幻灯片(n<=26),这n张幻灯片按照演讲要使用的顺序已经用数字1,2,…,n在上面编上了号。因为幻灯片是透明的,所以我们不能一下子看清每一个数字所对应的幻灯片。现在我们用大写字母A,B,C,。。。再次把幻灯片依次编上号,如样例所示,我们可以很快发现编号为A的幻灯片是第4张,把它抽出来后我们又可以确定编号为C的幻灯片是第2张,。。。你的任务是编写一个程序,把幻灯片的数字编号和字母编号对应起来,显然这种对应应该是唯一的;若是出现多种对应的情况或是某些数字编号和字母对应不起来,我们就称对应是无法实现的。

    Input

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

    Output

    若是对应可以实现,你的输出应该包括n行,每一行为一个字母和一个数字,中间以一个空格隔开,并且各行以字母的升序排列,注意输出的字母要大写并且顶格;反之,若是对应无法实现,在文件的第一行顶格输出None即可。行首行末无多余空格。

    Sample Input

    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

    Sample Output

    A 4
    
    B 1
    
    C 2
    
    D 3

    思路一:
     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 using namespace std;
     5 
     6 const int maxn=100;
     7 int n;
     8 struct node {
     9     int xmin;
    10     int xmax;
    11     int ymin;
    12     int ymax;
    13     int x;
    14     int y;
    15 }a[maxn],b[maxn];
    16 
    17 int y1[maxn],x1[maxn];
    18 
    19 bool bianjie(int x,int y,int x1,int x2,int y1,int y2)//判断数字是否在幻灯片的范围内
    20 {
    21     if(x>=x1&&x<=x2&&y>=y1&&y<=y2)
    22        return 1;
    23     return 0; 
    24 }
    25 
    26 int main()
    27 {
    28     while(cin>>n)
    29     {
    30         for(int i=1;i<=n;i++)//出入幻灯片的坐标
    31         {
    32             cin>>a[i].xmin>>a[i].xmax>>a[i].ymin>>a[i].ymax;
    33         }
    34         for(int i=1;i<=n;i++)
    35         {
    36             cin>>b[i].x>>b[i].y;
    37         }
    38             int m=n;
    39             memset(x1,0,sizeof(x1));
    40             memset(y1,0,sizeof(y1));
    41             int cnt=0;
    42             while(m--)
    43             {
    44                 for(int i=1;i<=n;i++)
    45                 {
    46                     if(y1[i]) continue;//如果数字已经有对应的字母了,查找下一个
    47                     int flag=0,temp;        
    48                     for(int j=1;j<=n;j++)
    49                     {
    50                         if(x1[j]) continue;//如果字母已经有对应的数字了,查找下一个
    51                         if(bianjie(b[i].x,b[i].y,a[j].xmin,a[j].xmax,a[j].ymin,a[j].ymax))//如果边界成立
    52                         {
    53                             temp=j;//记录坐标
    54                             flag++;//判断一个幻灯片存在几个数字
    55                         }
    56                     }
    57                     if(flag==1)//如果只对应一个数字
    58                     {
    59                         x1[temp]=i;//将数字存储在数组中
    60                         y1[i]=temp;//将字母的位置记录下来
    61                         cnt++;//判断是否所有的幻灯片都有唯一的数字对应
    62                     }
    63                 }
    64             }
    65             if(cnt!=n)//如果不是一一对应的,输出None
    66             {
    67                 cout<<"None"<<endl;
    68                 continue;
    69             }
    70             for(int i=1;i<=n;i++)//否则话,输出字母及其对应的数字
    71                 cout<<char(i+64)<<" "<<x1[i]<<endl;
    72     }
    73     return 0;
    74 }

     思路二:

     1 #include<iostream>
     2 #include<cstdio>
     3 #define MAXN 100000;
     4 using namespace std;
     5 
     6 const int maxn=1001;
     7 int r[maxn],c[maxn][maxn],d[maxn][maxn],f[maxn],ans[maxn];
     8 int n;
     9 struct A{
    10     int x1;
    11     int x2;
    12     int y1;
    13     int y2;
    14 }a[maxn];
    15 struct B{
    16     int x;
    17     int y;
    18 }b[maxn];
    19 
    20 int main()
    21 {
    22     cin>>n;
    23     for(int i=1;i<=n;i++)
    24       cin>>a[i].x1>>a[i].x2>>a[i].y1>>a[i].y2;
    25     for(int i=1;i<=n;i++)
    26     {
    27         cin>>b[i].x>>b[i].y;
    28         for(int q=1;q<=n;q++)
    29         {
    30              if(b[i].x>=a[q].x1&&b[i].x<=a[q].x2&&b[i].y>=a[q].y1&&b[i].y<=a[q].y2)
    31              {
    32                  r[q]++;
    33                  c[i][++c[i][0]]=q;
    34                  d[q][++d[q][0]]=i;
    35              }
    36         }
    37     }
    38     for(int k=1;k<=n;k++){
    39         int x=0,j;
    40           for(int j=1;j<=n;j++)
    41               if(r[j]==1){
    42                   r[j]=MAXN;
    43                   x=j;
    44                   break;
    45             }
    46         if(x==0){
    47             cout<<"None"<<endl;
    48             return 0;
    49         }
    50         for(j=1;j<=d[x][0];j++)
    51             if(f[d[x][j]]==0){
    52                 f[d[x][j]]=1;
    53                 break;
    54             }
    55         int y=d[x][j];
    56         for(j=1;j<=c[y][0];j++)
    57             r[c[y][j]]--;
    58         ans[x]=y;
    59     }
    60     for(int i=1;i<=n;i++)
    61        cout<<char(i+64)<<" "<<ans[i]<<endl;
    62     return 0;
    63 }

     蒟蒻的见解,理解的不对的地方请大佬指教!!!

  • 相关阅读:
    Golang Failpoint 的设计与实现
    没涉及到最值求解;观点:矩阵乘法无法表达出结果。 现实生活中事件、现象的数学表达
    多元微分学 枚举破解15位路由器密码 存储空间限制 拆分减长,求最值 数据去重
    ARP Poisoning Attack and Mitigation Techniques ARP欺骗 中间人攻击 Man-In-The-Middle (MITM) attack 嗅探 防范 Can one MAC address have two different IP addresses within the network?
    The C10K problem
    HTTP Streaming Architecture HLS 直播点播 HTTP流架构
    现代IM系统中消息推送和存储架构的实现
    现代IM系统中的消息系统架构
    长连接锁服务优化实践 C10K问题 nodejs的内部构造 limits.conf文件修改 sysctl.conf文件修改
    doubleclick cookie、动态脚本、用户画像、用户行为分析和海量数据存取 推荐词 京东 电商 信息上传 黑洞 https://blackhole.m.jd.com/getinfo
  • 原文地址:https://www.cnblogs.com/wsdestdq/p/6713265.html
Copyright © 2011-2022 走看看