[Jobdu] 题目1090:路径打印
- 题目描述:
-
给你一串路径,譬如:
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。
- 输出:
-
输出目录结构,每一个测试样例的输出紧跟一个空行。
- 样例输入:
-
4 a\b\c a\d\e b\cst d\ 0
- 样例输出:
-
a b c d e b cst d
先帖代码如下:#include <iostream> #include <vector> #include <string> #include <cstdio> #include <algorithm> using namespace std; bool comp(string a,string b){ int l = a.length()>b.length()?b.length():a.length(); for(int i=0;i<l;i++){ if(a[i]!=b[i]){ if(a[i]!='\\'&&b[i]!='\\'){ return a[i]<b[i]; } else if(a[i]=='\\'){ return true; } else if(b[i]=='\\'){ return false; } } } return a.length()<b.length(); } int main(int argc,char* argv[]){ //freopen("input.txt","r",stdin); int n; string str; vector<string> v; while(cin>>n&&n){ v.resize(0); while(n--){ cin>>str; //cout<<str<<endl; if(str[str.length()-1]=='\\'){ str.erase(str.length()-1,str.length()); } if(find(v.begin(),v.end(),str)==v.end()){ v.push_back(str); } while(str.find('\\')!=string::npos){ str.erase(str.find_last_of('\\'),str.length()); if(find(v.begin(),v.end(),str)==v.end()){ v.push_back(str); } } } sort(v.begin(),v.end(),comp); for(int i=0;i<v.size();i++){ if(v[i].find('\\')==string::npos){ cout<<v[i]<<endl; } else{ for(int j=0;j<v[i].find_last_of('\\');j++){ cout<<" "; } cout<<" "; cout<<v[i].substr(v[i].find_last_of('\\')+1,v[i].length()); cout<<endl; } } cout<<endl; } return 0; }
这道题目卡了很久。一直PE,原来题目中的输出要求指的是 子目录比父目录向右缩一格
指的是 子节点的缩进长度 =父亲节点的缩进 +父亲节点本身字符串长度+1.懒得写注释了,程序的思想是把所有的文件提取出来,存在一个vector里,对其按要求排序输出即可。
比如说样例中的:
a\b\c
a\d\e
b\cst
d\
首先从这些目录中提取出所有的文件(包含路径),得到:
a、a\b、a\b\c、a\d、a\d\e、b、b\cst、d,
然后要做的就是排序了,过程很简单,在自定义的comp函数中实现。
在这儿排序后的结果应该跟上面一样。
最后输出,输出的时候把文件路径的部分隐掉,至于空格的数量看题目的要求了。这儿最蛋疼了,一直没搞清楚题意,害我PE了10几次。
这题也可以用字典树吧,感觉还是这个实现起来简单一点。