数据结构与算法题目集(中文) - 7-30 目录树(30 分)

题目链接:点击打开链接

题目大意:略。

解题思路:略。

AC 代码

#include<bits/stdc++.h>
#include<cmath>

#define mem(a,b) memset(a,b,sizeof a);
#define INF 0x3f3f3f3f

using namespace std;

typedef long long ll;

const int maxn=500;

struct node
{
    string name;
    int pri;
    vector<node> vec;
    node(){}
    node(string name,int pri):name(name),pri(pri){}
}rt;

int cmp(node n1,node n2)
{
    if(n1.pri==n2.pri) return n1.name<n2.name;
    return n1.pri>n2.pri;
}

string a[maxn];
int pris[maxn];

void add(node &nd,int pos,int cnt)
{
    if(cnt==pos) return;
    int i;
    for(i=0;i<nd.vec.size();i++)
    {
        if(a[pos]==nd.vec[i].name)
        {
            add(nd.vec[i],pos+1,cnt);
            return ;
        }
    }

    node tnd(a[pos],pris[pos]);
    nd.vec.push_back(tnd);
    add(nd.vec[i],pos+1,cnt);
}

void dfs(node nd,int cnt)
{
    for(int i=0;i<cnt;i++) printf("  ");
    printf("%s\n",nd.name.c_str());
    sort(nd.vec.begin(),nd.vec.end(),cmp);
    for(int i=0;i<nd.vec.size();i++) dfs(nd.vec[i],cnt+1);
}

int main()
{
    int n, cur;
    string s,ts;
    stringstream ss;
    while(~scanf("%d",&n))
    {
        cin.get();
        rt.name="root";
        rt.pri=1; // 是目录
        rt.vec.clear();
        for(int i=0;i<n;i++)
        {
            getline(cin,s);
            int flag=s[s.length()-1]=='\\'?1:0; // 判断最后是否为目录
            for(int j=0;j<s.length();j++)
                if(!isalpha(s[j])) s[j]=' ';

            ss.clear(); ss.str(""); ss<<s;
            cur=0;
            while(ss>>ts)
            {
                a[cur]=ts;
                pris[cur++]=1; // 标记为目录
            }

            if(!flag) pris[cur-1]=0;
            add(rt,0,cur);
        }

        dfs(rt,0);
    }

    return 0;
}

猜你喜欢

转载自blog.csdn.net/dream_weave/article/details/81174335