【2019csp模拟】文件列表

[2019csp模拟] 文件列表

题目描述

生成像 cmd 里 "tree" 指令一样的树,要求如下:

生成的列表格式有如下要求:

1.属于同一层的文件或文件夹位于相同的缩进处,相邻两层文件间差距 5 个字
符;
2.每个文件夹或文件前有 4 个'-'(根目录除外),文件夹下方属于文件夹的部分有
'|';
3.属于统一文件夹下的文件或子文件夹按字典序排列;

如图:

\(\mathbb{Solution:}\)

就是一个暴力题,直接按题意做即可,可以对于文件夹递归解决。

最好是存 vector + map,可以简便地字典序排序。

\(\mathbf{Code:}\)

#include <bits/stdc++.h>
#define mp(x, y) make_pair(x, y)
const int N = 51;
using namespace std;
int n;
string s;
inline char readc() { char c = getchar(); for (; (c < 'a' || c > 'z') && c != '/'; c = getchar()); return c; }
std::map<pair<string, string>, std::vector<string> > F;
inline void Print(string u, string la, string sig) {
    for (int i = 0; i < (int)F[mp(u, sig)].size(); ++i) {
        string v = F[mp(u, sig)][i];
        cout << (u == "" ? "" : la + "----") << v << endl;
        Print(v, la + (u == "" ? "" : "    |"), sig + v);
    }
}
int main(void) {
	freopen("file.in", "r", stdin), freopen("file.out", "w", stdout);
    scanf("%d", &n), F.clear(), F[mp("", "")].clear();
    for (int i = 1; i <= n; ++i) {
        cin >> s; string la = "", t = "", sign = "", sl = "";
        for (int j = 0; j < (int)s.size(); ++j)
            if (s[j] != '/') t += s[j], sign += s[j];
            else {
                if (F.count(mp(t, sign))) { la = t, sl = sign, t = ""; continue; }
                F[mp(la, sl)].push_back(t), F[mp(t, sign)].clear(), la = t, sl = sign, t = "";
            }
        if (F.count(mp(t, sign))) { la = t, sl = sign, t = ""; continue; }
        F[mp(la, sl)].push_back(t), F[mp(t, sign)].clear(), la = t, t = "";
    }
    map<pair<string, string>, std::vector<string> >::iterator it;
    for (it = F.begin(); it != F.end(); ++it) { sort((*it).second.begin(), (*it).second.end()); }
    Print("", "|", "");
    return 0;
}

posted @ 2020-08-17 16:27  云烟万象但过眼  阅读(23)  评论(0编辑  收藏  举报