[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几次。

这题也可以用字典树吧,感觉还是这个实现起来简单一点。



posted @ 2012-08-16 14:49  Eason Liu  阅读(501)  评论(0编辑  收藏  举报