1 条题解

  • 0
    @ 2025-5-13 11:51:06

    一、问题核心

    本题主要处理计算机文件结构的表示问题,输入一系列文件和目录名称,以特定符号(* 表示数据集结束,# 表示所有数据结束,] 表示目录结束)分隔,要求将文件和目录按规则(子目录先于文件,文件按字母顺序排列)进行缩进展示。

    二、算法标签

    字符串处理:对输入的文件名和目录名进行解析,提取名称信息,处理结束符号等。 数据结构应用:使用合适的数据结构(如列表、字典)来存储文件和目录的层次结构,方便后续按规则输出。 排序算法:对每个目录下的文件进行排序,使文件按字母顺序排列。 递归算法:处理目录的嵌套结构,递归地处理子目录的内容。

    三、关键思路

    (一)输入处理

    从标准输入逐行读取数据,当遇到 * 时,结束当前数据集的处理;当遇到 # 时,结束所有数据的处理。 对于每行数据,判断是文件(以 f 开头)还是目录(以 d 开头),并将其存储到合适的数据结构中。遇到 ] 表示当前目录内容处理完毕。

    (二)数据结构设计

    使用字典来表示文件和目录的层次结构,字典的键是目录名,值是一个列表,列表中存储子目录和文件的信息。 对于文件,直接存储文件名;对于子目录,存储子目录的字典(递归结构)。

    (三)排序操作

    对于每个目录下的文件和子目录,使用排序算法(如 Python 内置的 sorted 函数)进行排序。 排序时,对于文件按文件名的字母顺序排列;对于子目录,按目录名的字母顺序排列。

    (四)输出处理

    递归地遍历文件和目录的层次结构,按缩进规则(每个缩进级别显示一个 | 后跟 5 个空格)输出。 对于目录,先输出目录名,然后递归地输出子目录和文件;对于文件,直接输出文件名。

    四、示例代码(c++)

    #include<cstdio>
    #include<iostream>
    #include<cstring>
    #include<algorithm>
    #include<cmath>
    using namespace std;
    
    typedef long long LL;
    const int SZ = 1010;
    const int INF = 1000000010;
    
    struct node{
        int fcnt,dcnt;
        string f[30],d[30],name;
        node *dir[30],*fa;
    }T[SZ], *root;
    
    int Tcnt = 0;
    
    node* newnode(string s,node *fa)
    {
        node *k = T + (Tcnt ++);
        memset(k -> dir,0,sizeof(k -> dir));
        k -> fa = fa;
        for(int i = 0;i < 30;i ++) k -> f[i] = k -> d[i] = "";
        k -> fcnt = k -> dcnt = 0;
        k -> name = s;
        return k; 
    }
    
    void printtab(int x)
    {
        for(int i = 1;i <= x;i ++)
            printf("|     ");
    }
    
    void dfs(node *p,int d)
    {
        if(!p) return;
        cout << p -> name << endl;
        for(int i = 1;i <= p -> dcnt;i ++)
            printtab(d + 1),dfs(p -> dir[i],d + 1);
        sort(p -> f + 1,p -> f + 1 + p -> fcnt);
        for(int i = 1;i <= p -> fcnt;i ++)
            printtab(d),cout << p -> f[i] << endl; 
    }
    
    void init() { Tcnt = 0; root = newnode("ROOT",NULL); }
    
    string s[SZ];
    
    int main()
    {
        init();
        int Case = 0,n = 1;
        while(cin >> s[n]) n ++;
    
    
        node *p = root;
        for(int i = 1;i <= n;i ++)
        {
            if(s[i][0] == 'f')
                p -> f[++ p -> fcnt] = s[i];
            else if(s[i][0] == 'd')
            {
                p -> d[++ p -> dcnt] = s[i];
                p -> dir[p -> dcnt] = newnode(s[i],p);
                p = p -> dir[p -> dcnt];
            }
            else if(s[i][0] == ']')
                p = p -> fa;
            else if(s[i] == "*")
            {
                printf("DATA SET %d:\n",++ Case);
                dfs(root,0); puts("");
                p = root;
                init();
            }
        }
    
        return 0;
    }
    
    
    
    • 1

    信息

    ID
    58
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者