zoukankan      html  css  js  c++  java
  • OpenJudge 2775 文件结构“图”/ Poj 1057 FILE MAPPING

    1.链接地址:

    http://bailian.openjudge.cn/practice/2775

    http://poj.org/problem?id=1057

    2.题目:

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

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

    这个图说明:ROOT目录包括两个文件和三个子目录。第一个子目录包含3个文件,第二个子目录是空的,第三个子目录包含一个文件。
    输入
    你的任务是写一个程序读取一些测试数据。每组测试数据表示一个计算机的文件结构。每组测试数据以'*'结尾,而所有合理的输入数据以'#'结 尾。一组测试数据包括一些文件和目录的名字(虽然在输入中我们没有给出,但是我们总假设ROOT目录是最外层的目录)。在输入中,以']'表示一个目录的 内容的结束。目录名字的第一个字母是'd',文件名字的第一个字母是'f'。文件名可能有扩展名也可能没有(比如fmyfile.dat和 fmyfile)。文件和目录的名字中都不包括空格。
    输出
    在显示一个目录中内容的时候,先显示其中的子目录(如果有的话),然后再显示文件(如果有的话)。文件要求按照名字的字母表的顺序显示(目录 不用按照名字的字母表顺序显示,只需要按照目录出现的先后显示)。对每一组测试数据,我们要先输出"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 的试题

    3.思路:

    递归题+利用vector + struct + sort

    善于利用C++的STL可以把代码写得很简短,而已用vector可以节约很多不必要的内存浪费

    4.代码:

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <vector>
     4 #include <string>
     5 #include <algorithm>
     6 
     7 using namespace std;
     8 
     9 struct Dir
    10 {
    11     string name;
    12     vector<string> files;
    13     vector<Dir> dirs;
    14 };
    15 
    16 Dir input(string name)
    17 {
    18     Dir dir;
    19 
    20     string str;
    21     cin >> str;
    22 
    23     if(str == "#") return dir;
    24 
    25     dir.name = name;
    26 
    27     while(str != "*" && str != "]")
    28     {
    29         if(str[0] == 'f') dir.files.push_back(str);
    30         else dir.dirs.push_back(input(str));
    31 
    32         cin >> str;
    33     }
    34     
    35     return dir;
    36 }
    37 
    38 void iprintf(int level,string str)
    39 {
    40     int i;
    41     for(i = 0; i < level; ++i)
    42     {
    43         cout << "|     ";
    44     }
    45     cout << str << endl;
    46     return;
    47 }
    48 
    49 void output(Dir dir,int level)
    50 {
    51     iprintf(level,dir.name);
    52 
    53     int v_i;
    54     for(v_i = 0; v_i != dir.dirs.size(); ++v_i) output(dir.dirs[v_i],level + 1);
    55 
    56     sort(dir.files.begin(),dir.files.end());
    57     for(v_i = 0; v_i != dir.files.size(); ++v_i) iprintf(level,dir.files[v_i]);
    58 
    59     return;
    60 }
    61 
    62 int main()
    63 {
    64     //freopen("C://input.txt","r",stdin);
    65 
    66     int count = 1;
    67 
    68     Dir dir = input("ROOT");
    69     while(dir.name == "ROOT")
    70     {
    71 
    72         cout << "DATA SET " << count++ << ":" << endl;
    73         output(dir,0);
    74         cout << endl;
    75 
    76         dir = input("ROOT");
    77     }
    78 
    79     return 0;
    80 }
  • 相关阅读:
    diary and html 文本颜色编辑,行距和其它编辑总汇
    bash coding to changeNames
    virtualbox ubuntu 网络连接 以及 连接 secureCRT
    linux 学习6 软件包安装
    linux 学习8 权限管理
    vim 使用2 转载 为了打开方便
    ubuntu
    linux 学习15 16 启动管理,备份和恢复
    linux 学习 14 日志管理
    linux 学习 13 系统管理
  • 原文地址:https://www.cnblogs.com/mobileliker/p/3563789.html
Copyright © 2011-2022 走看看