描述
给你一串路径,譬如:
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;
}