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

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



你可能感兴趣的:(job)