Skip to content

T02775: 文件结构“图”

tree, http://cs101.openjudge.cn/practice/02775/

思路:用栈维护当前目录层次,每遇到目录就入栈、遇到 ] 出栈,递归输出目录与文件。

cpp
#include <iostream>
#include <vector>
#include <string>
#include <stack>
#include <algorithm>
using namespace std;

bool isDir(const string& name) {
    return !name.empty() && name[0] == 'd';
}

void dfs(int dir, const string& prefix,
         const vector<string>& name,
         const vector<vector<int>>& subdirs,
         const vector<vector<string>>& subfiles) {
    cout << prefix << name[dir] << "\n";
    string subprefix = prefix + "|     ";
    for (int subdir : subdirs[dir]) {
        dfs(subdir, subprefix, name, subdirs, subfiles);
    }
    vector<string> files = subfiles[dir];
    sort(files.begin(), files.end());
    for (const string& f : files) {
        cout << prefix << f << "\n";
    }
}

bool solve(int cas) {
    int id = 0;
    vector<string> name(1, "ROOT");
    vector<vector<int>> subdirs(1);
    vector<vector<string>> subfiles(1);
    stack<int> stk;
    stk.push(0);
    string line;

    while (true) {
        if (!getline(cin, line))
            return false;
        if (line == "#") return false;
        if (line == "*") break;

        if (isDir(line)) {
            ++id;
            name.push_back(line);
            subdirs.push_back({});
            subfiles.push_back({});
            subdirs[stk.top()].push_back(id);
            stk.push(id);
        } else if (line == "]") {
            stk.pop();
        } else {
            subfiles[stk.top()].push_back(line);
        }
    }

    cout << "DATA SET " << cas << ":\n";
    dfs(0, "", name, subdirs, subfiles);
    cout << "\n";
    return true;
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int cas = 1;
    while (solve(cas)) {
        ++cas;
    }
    return 0;
}