【SOJ 920】文件列表

【题目】

题目描述:

BSOI在线评测机被不明身份的人入侵了!!系统中大量的数据遭到恶意破坏,数据文件残缺不全。现在,老师正在尽力抢救数据文件。为了检查数据文件是否完整,老师打印出了所有文件的列表,但数据文件太多,老师眼睛都要看花了。所以,为了方便老师检查,需要你写个程序处理一下文件列表,转换成下面这样统一的格式:( //后面为注释 )
data                     //data文件夹,根目录
|----prob                //data下面的文件夹
|    |----a.in           //prob下面的文件
|    |----a.out
|----qq                  //data下面的文件夹
|    |----new            //qq下面的文件夹
|    |    |----ok.txt    //new下面的文件
|    |----old            //空文件夹
|----xxx.rmvb
生成的列表格式有如下要求:
1.属于同一层的文件或文件夹位于相同的缩进处,相邻两层文件间差距 5 个字符;
2.每个文件夹或文件前有 4 个 '-' (根目录除外),文件夹下方属于文件夹的部分有 '|';
3.属于同一文件夹下的文件或子文件夹按字典序排列;

输入格式:

第一行一个整数 n(n ≤ 50),表示总共的文件数目;
接下来 n 行,每行描述一个文件的路径,路径以 '/' 作为文件分隔符;
所有文件(及文件夹)名均由小写字母和英文点组成;
所有输入的根目录都是一样的,文件名长度不超过 10 个字符,每个文件夹下不超过 15 个文件,不超过 5 层。

输出格式:

输出符合要求的文件列表。

样例数据:

输入

5
mydoc/abcd/abc.txt
mydoc/dd/libexec.a
mydoc/stdio.h
mydoc/abcd/zzz/game.cpp
mydoc/abcd/new

输出

mydoc
|----abcd
|    |----abc.txt
|    |----new
|    |----zzz
|    |    |----game.cpp
|----dd
|    |----libexec.a
|----stdio.h

备注:

【数据范围】
对于 30% 的数据,根目录下只有文件,没有文件夹。

【分析】

起初做这道题只是感觉比较好玩,结果卡了我半天

思路还是很简单的,就是先对文件路径进行排序,对于每个文件路径,都跟上一个文件路径进行比较,如果发现了不一样的文件,就输出它以及它以后的所有文件

推荐使用 string 类型,这样方便排序

【代码】

#include<cstdio>
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int num[100];
string a[100],s[100][10];
string Get_string(int id,int &now)
{
	string ans="";
	while(a[id][now]!='/')
	{
		ans+=a[id][now];
		now++;
	}
	return ans;
}
int main()
{
	int n,i,j,k,l,x;
	cin>>n;
	for(i=1;i<=n;++i)
	  cin>>a[i];
	sort(a+1,a+n+1);
	for(i=1;i<=n;++i)
	{
		a[i]+='/';
		j=-1,num[i]=0;
		l=a[i].length();
		while(j+1<l)
		  s[i][++num[i]]=Get_string(i,++j);
	}
	for(i=1;i<=n;++i)
	{
		for(j=1;j<=num[i];++j)
		    if(s[i][j]!=s[i-1][j])
			break;
		x=j;
		for(j=x;j<=num[i];++j)
		{
			for(k=1;k<=j-2;++k)
			  cout<<"|    ";
			if(j!=1)  cout<<"|----";
			cout<<s[i][j]<<'\n';
		}
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/forever_dreams/article/details/81704076