zoukankan      html  css  js  c++  java
  • poj 2775 文件结构“图"

    总时间限制: 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

    提示

    一个目录和它的子目录处于不同的层次
    一个目录和它的里面的文件处于同一层次

    解题思路

    这道题确实一开始就是想用递归做,但是没有处理好根目录和子目录的统一,而且虽然样例过了依然还是WA。有待提高!

    大佬的代码简单易懂,我就不注释了。

    WA代码

    #include<iostream>
    #include<string>
    #include<algorithm>
    #include <ostream>  
    #include <fstream>  
    using namespace std;
    
    const string TAB = "|     ";
    
    void GetDir(string s, int tabnum)
    {
        for (int i = 0; i < tabnum; i++)
            cout << TAB;
        cout << s <<endl;
        string name;
        string file[31];
        int num = 0;
        cin >> name;
        while (name[0] != ']')
        {
            if (name[0] == 'f')
            {
                file[num++] = name;
            }
            if (name[0] == 'd')
            {
                tabnum++;
                GetDir(name, tabnum);
            }
            cin >> name;
        }
        sort(file, file + num);
        for (int i = 0; i < num; i++)
        {
            for (int j = 0; j < tabnum; j++)
                cout << TAB;
            cout << file[i] << endl;
        }
    }
    
    void GetRoot(int i)
    {
        string name;
        string files[31];
        int num = 0;
        cin >> name;
        if (name[0] == '#') return;
        if(i>0) cout<<endl;
        cout << "DATA SET "<<i+1<<":" << endl;
        cout << "ROOT" << endl;
        while (name[0] != '*')
        {
            if (name[0] == 'f')
            {
                files[num++] = name;
            }
            if (name[0] == 'd')
            {
                GetDir(name,1);
            }
            cin >> name;
        }
        sort(files, files + num);
        for (int j = 0; j < num; j++)
        {
            cout << files[j] << endl;
        }
        if (name[0] == '*') GetRoot(i+1);
    }
    
    int main()
    {
        ofstream fout("output.txt"); 
        streambuf *coutbackup; 
        coutbackup= cout.rdbuf(fout.rdbuf());  //用 rdbuf() 重新定向
        GetRoot(0);
        return 0;
    }

    大佬AC代码

    https://blog.csdn.net/PKU_ZZY/article/details/51377360

    #define TAB "|     "
    
    #include<stdio.h>
    #include<string.h>
    #include<string> 
    #include<algorithm>
    
    using namespace std;
    
    int cases=1;
    char str[35];
    bool isFinish=false;
    
    void deal(int tab_num)
    {
        string file_name[35];
        int file_num=0;
        scanf("%s",str);
        if (tab_num==0 && str[0]!='#')
        {
            if (cases>1)
                printf("
    ");
            printf("DATA SET %d:
    ",cases);
            printf("ROOT
    ");
        }
        while (true)
        {
            if (str[0]=='*' || str[0]==']')
                break;
            else if (str[0]=='#')
            {
                isFinish=true;
                return;
            }
            else if (str[0]=='f')
                file_name[file_num++]=str;
            else if (str[0]=='d')
            {
                for (int i=0;i<tab_num+1;i++)
                    printf("%s",TAB);
                printf("%s
    ",str);
                deal(tab_num+1); 
            }
            scanf("%s",str);
        }
        sort(file_name,file_name+file_num);
        for (int i=0;i<file_num;i++)
        {   
            for (int j=0;j<tab_num;j++)
                printf("%s",TAB);
            printf("%s
    ",file_name[i].c_str());
        }
        return;
    }
    
    int main()
    {
        //freopen("output.txt","w",stdout);
        while (!isFinish)
        {
            deal(0);
            cases++;
        }
        return 0;
    }
  • 相关阅读:
    python模块—socket
    mac os系统的快捷键
    教你如何将UIImageView视图中的图片变成圆角
    关于ASP.NET MVC
    iOS 日期格式的转换
    将App通过XCode上传到AppStore 出现这个错误“An error occurred uploading to the iTunes Store”的解决方法
    关于MAC OS下面两个软件的功能改进——Dictionary和Fit 输入法
    分享一下上个星期的香港行程
    【博客园IT新闻】博客园IT新闻 iPhone 客户端发布
    解决Entity Framework Code First 的问题——Model compatibility cannot be checked because the database does not contain model metadata
  • 原文地址:https://www.cnblogs.com/yun-an/p/10920677.html
Copyright © 2011-2022 走看看