玩命加载中 . . .

路径打印


http://t.cn/E9dvHs4

描述

给你一串路径,譬如:

a\b\c

a\d\e

b\cst

d\

你把这些路径中蕴含的目录结构给画出来,子目录直接列在父目录下面,并比父目录的首字符向右缩两个空格,就像这样:

a

b

c

d

e

b

cst

d

注:同一级的需要按字母顺序排列,不能乱。

输入描述:

每个测试案例第一行为一个正整数n(n<=10)表示有n个路径,当n为0时,测试结束,接下来有n行,每行有一个字串表示一个路径,长度小于50。

输出描述:

输出目录结构,每一个测试样例的输出紧跟一个空行。

示例1

输入:

4
a\b\c
a\d\e
b\cst
d\
0

复制

输出:

a
  b
    c
  d
    e
b
  cst
d
#define _CRT_SECURE_NO_WARNINGS 1
#include <bits/stdc++.h>
using namespace std;

int main() {
    int n;
    vector<string> v, vs;
    vector< vector<string> > ve;
    while (cin >> n) {
        string str;
        if (n == 0) return 0;

        v.clear();  //存放初始的所有行
        for (int i = 0; i < n; i++) {
            cin >> str;
            while (str[str.length() - 1] != '\\') str += '\\';  //对每行进行处理,处理成最后有\的路径形式
            v.push_back(str);
        }
        sort(v.begin(), v.end());  //排序

        ve.clear();  //二维数组初始化
        for (int i = 0; i < v.size(); i++) {
            int begin = 0, end = 0;
            vs.clear();  //每个一维数组初始化
            while ((end = v[i].find("\\", begin)) != string::npos) {
                vs.push_back(v[i].substr(begin, end - begin));
                begin = end + 1;
            }
            ve.push_back(vs);  //存放进二维数组中
        }
        for (int i = 0; i < n; i++) {
            if (i > 0 && ve[i][0] == ve[i - 1][0]) {  //与前一个目录有相同的根目录
                int j = 1;
                while (j < ve[i].size() && ve[i][j] == ve[i - 1][j]) j++;  //找到第一个不同的目录
                for (; j < ve[i].size(); j++) {
                    for (int k = 0; k < j; k++) {
                        cout << "  ";  //j是该目录在该路径中的下标,控制缩进的次数
                    }
                    cout << ve[i][j] << endl;
                }
            }//if
            else {
                for (int j = 0; j < ve[i].size(); j++) {
                    for (int k = 0; k < j; k++) {
                        cout << "  ";
                    }
                    cout << ve[i][j] << endl;
                }//for
            }//else
        }//for
        cout << endl;  //每个测试用例最后都有一个空行
    }//while
    return 0;
}

文章作者: Jack Tim
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Jack Tim !
评论
  目录