• 1777:文件结构“图”


    1777:文件结构“图”

    总时间限制: 
    1000ms
     
    内存限制: 
    65536kB
    描述

    在计算机上看到文件系统的结构通常很有用。Microsoft Windows上面的"explorer"程序就是这样的一个例子。但是在有图形界面之前,没有图形化的表示方法的,那时候最好的方式是把目录和文件的结构显示成一个"图"的样子,而且使用缩排的形式来表示目录的结构。比如:

    ROOT
    | dir1
    | file1
    | file2
    | file3
    | dir2
    | dir3
    | file1
    file1
    file2

    这个图说明:ROOT目录包括三个子目录和两个文件。第一个子目录包含3个文件,第二个子目录是空的,第三个子目录包含一个文件。

    输入
    你的任务是写一个程序读取一些测试数据。每组测试数据表示一个计算机的文件结构。每组测试数据以'*'结尾,而所有合理的输入数据以'#'结尾。一组测试数据包括一些文件和目录的名字(虽然在输入中我们没有给出,但是我们总假设ROOT目录是最外层的目录)。在输入中,以']'表示一个目录的内容的结束。目录名字的第一个字母是'd',文件名字的第一个字母是'f'。文件名可能有扩展名也可能没有(比如fmyfile.dat和fmyfile)。文件和目录的名字中都不包括空格,长度都不超过30。一个目录下的子目录个数和文件个数之和不超过30。
    输出
    在显示一个目录中内容的时候,先显示其中的子目录(如果有的话),然后再显示文件(如果有的话)。文件要求按照名字的字母表的顺序显示(目录不用按照名字的字母表顺序显示,只需要按照目录出现的先后显示)。对每一组测试数据,我们要先输出"DATA SET x:",这里x是测试数据的编号(从1开始)。在两组测试数据之间要输出一个空行来隔开。

    你需要注意的是,我们使用一个'|'和5个空格来表示出缩排的层次。
    样例输入
    file1
    file2
    dir3
    dir2
    file1
    file2
    ]
    ]
    file4
    dir1
    ]
    file3
    *
    file2
    file1
    *
    #
    样例输出
    DATA SET 1:
    ROOT
    |     dir3
    |     |     dir2
    |     |     file1
    |     |     file2
    |     dir1
    file1
    file2
    file3
    file4
    
    DATA SET 2:
    ROOT
    file1
    file2
    
    提示
    一个目录和它的子目录处于不同的层次
    一个目录和它的里面的文件处于同一层次
    来源
    翻译自 Pacific Northwest 1998 的试题
     1 #include<iostream>
     2 #include<algorithm>
     3 #include<cstdio>
     4 using namespace std;
     5 string a;
     6 int cc;//输出深度
     7 int now=1;//记录当前*数量 
     8 int flag=0;
     9 void work()
    10 {
    11     string str[50];//储存该目录下的文件 
    12     int l=0;
    13     while(cin>>a)
    14     {
    15         if(flag==0&&a[0]!='#')
    16         {
    17             cout<<"DATA SET "<<now<<":"<<endl;
    18             cout<<"ROOT"<<endl;
    19             flag=1;
    20         }
    21         if(a[0]=='#')
    22         return;
    23         else if(a[0]=='*')
    24         {
    25             cc=0;
    26             sort(str+0,str+l);
    27             for(int i=0;i<l;i++)
    28             {
    29                 cout<<str[i]<<endl;
    30             }
    31             cout<<endl;
    32             now++;
    33             //cout<<"DATA SET "<<now<<":"<<endl;
    34             //cout<<"ROOT"<<endl;
    35             flag=0;
    36             work();
    37         }
    38         else if(a[0]=='d')
    39         {
    40             //cc++;
    41             //str[l]=a;
    42             //l++;
    43             cc++;
    44             for(int i=1;i<=cc;i++)
    45             {
    46                 cout<<"|";
    47                 for(int j=1;j<=5;j++)
    48                 cout<<" ";
    49             }
    50             cout<<a<<endl;
    51             work();
    52         }
    53         else if(a[0]=='f')
    54         {
    55             
    56             str[l]=a;
    57             l++;
    58             continue;
    59         }
    60         else if(a[0]==']')
    61         {
    62             
    63             sort(str+0,str+l);
    64             for(int i=0;i<l;i++)
    65             {    
    66                 for(int k=1;k<=cc;k++)
    67                 {    
    68                     cout<<"|";
    69                     for(int j=1;j<=5;j++)
    70                     cout<<" ";
    71                 }
    72                 cout<<str[i]<<endl;
    73             }
    74             cc--;
    75             return;
    76         }
    77     }
    78 }
    79 int main()
    80 {
    81     //freopen("r.txt","r",stdin);
    82     //freopen("w.txt","w",stdout);
    83     work();
    84     return 0;
    85 }
  • 相关阅读:
    Linux中touch和mkdir、vi的区别
    宿主机和虚拟机的IP地址和端口号的区别
    测试环境
    Fiddler
    Linux 常用指令
    测试环境的网址与账号密码
    书签
    快速寻找满足条件的两个数
    android 资讯阅读器(二)
    android 资讯阅读器
  • 原文地址:https://www.cnblogs.com/zwfymqz/p/6549431.html
Copyright © 2020-2023  润新知