【题目传送门:】戳

【描述:】

在计算机上看到文件系统的结构通常很有用。Microsoft Windows上面的"explorer"程序就是这样的一个例子。但是在有图形界面之前,没有图形化的表示方法的,那时候最好的方式是把目录和文件的结构显示成一个"图"的样子,而且使用缩排的形式来表示目录的结构。比如:

ROOT
|     dir1
|     file1
|     file2
|     file3
|     dir2
|     dir3
|     file1
file1
file2

这个图说明:ROOT目录包括三个子目录和两个文件。第一个子目录包含3个文件,第二个子目录是空的,第三个子目录包含一个文件。

【输入:】

你的任务是写一个程序读取一些测试数据。每组测试数据表示一个计算机的文件结构。每组测试数据以'*'结尾,而所有合理的输入数据以'#'结尾。一组测试数据包括一些文件和目录的名字(虽然在输入中我们没有给出,但是我们总假设ROOT目录是最外层的目录)。在输入中,以']'表示一个目录的内容的结束。目录名字的第一个字母是'd',文件名字的第一个字母是'f'。文件名可能有扩展名也可能没有(比如fmyfile.dat和fmyfile)。文件和目录的名字中都不包括空格,长度都不超过30。一个目录下的子目录个数和文件个数之和不超过30。

【输出:】

在显示一个目录中内容的时候,先显示其中的子目录(如果有的话),然后再显示文件(如果有的话)。文件要求按照名字的字母表的顺序显示(目录不用按照名字的字母表顺序显示,只需要按照目录出现的先后显示)。对每一组测试数据,我们要先输出"DATA SET x:",这里x是测试数据的编号(从1开始)。在两组测试数据之间要输出一个空行来隔开。

你需要注意的是,我们使用一个'|'和5个空格来表示出缩排的层次。

【算法分析:】

跟去年的d1t2时间复杂度有一些像,

使用递归模拟,(递归常熟大也可以用栈)

递归函数有一个参数hp表示进入了几个文件

遇到 dir 就 hp+1,遇到 ] 就 hp-1,遇到 * 就return

如果遇到文件的话把文件加入到一个堆p[hp]中,这就在输出的时候保证了文件的字母是按字母表的顺序排的

p[i]表示第i层文件夹的文件

离线做,先把读入的一群字符串存到string数组里,用num[i]表示第i个文件结构的开始位置

递归时设置一个指针t,表示读到第t行string

每次递归或是遇到文件的时候t就自增1

最后结束时把p[1]里的文件输出

【代码:】

 1 //文件结构“图”
 2 #include<iostream>
 3 #include<cstdio>
 4 #include<cstring>
 5 #include<algorithm>
 6 #include<queue>
 7 using namespace std;
 8
 9 int t, num[1001];
10 string s[1001];
11 priority_queue<string, vector<string>, greater<string> > q[1001];
12
13 void work(int hp) {
14     if(s[t][0] == '*' || hp == 0) return;
15     if(s[t][0] == 'd') {
16         for(int i = 1; i <= hp; i++)
17             printf("|     ");
18         cout << s[t] << endl;
19         t++; work(hp + 1);
20     }
21     if(s[t][0] == 'f') {
22         q[hp].push(s[t]);
23         t++; work(hp);
24     }
25     if(s[t][0] == ']') {
26         while(!q[hp].empty()) {
27             for(int i = 1; i < hp; i++)
28                 printf("|     ");
29             cout << q[hp ].top() << endl;
30             q[hp].pop();
31         }
32         t++; work(hp - 1);
33     }
34 }
35 int main() {
36     int x = 1, cnt = 1;
37     num[cnt] = 1;
38     while(cin >> s[x]) {
39         if(s[x] == "*") num[++cnt] = x + 1;
40         ++x;
41     }
42     x--, cnt--;
43     for(int i = 1; i <= cnt; i++) {
44         printf("DATA SET %d:\nROOT\n", i);
45         t = num[i];
46         work(1);
47         while(!q[1].empty()) {
48             cout << q[1].top() << endl;
49             q[1].pop();
50         }
51         puts("");
52     }
53 }

转载于:https://www.cnblogs.com/devilk-sjj/p/9032012.html

【openjudge】【字符串+模拟】1777:文件结构“图”相关推荐

  1. 1777:文件结构“图”

    1777:文件结构"图" 查看 提交 统计 提问 总时间限制:  1000ms 内存限制:  65536kB 描述 在计算机上看到文件系统的结构通常很有用.Microsoft Wi ...

  2. CF5A Chat Server's Outgoing Traffic(字符串模拟,find函数的应用)难度⭐

    题意翻译 Polycarp正在开发一个名为"Polychat"的新项目.按照IT的现代倾向,他决定,这个项目也应该包含聊天.为了实现这一目标,Polycarp在笔记本电脑前花费了几 ...

  3. 剑指offer:汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。

    汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果.对于一个给定的字符序列S,请你把其循环左移K位后的序列输出.例如,字符序列S="abc ...

  4. 【Luogu1580】yyy loves Easter_Egg I(纯字符串模拟)

    problem 保持队形(我们认为只要这一句内含有且恰好含有一次@,@的人和上一句话一样就算为队形) 若艾特的人与第一个人不同,就算队形被打破,油炸失败.若这个人在队形被打破之前出来吱声了,或者就是他 ...

  5. matlab实例静电场,浅析Matlab模拟静电场三维图与恒定电流场模拟静电场

    浅析Matlab模拟静电场三维图与恒定电流场模拟静电场 浅析Matlab模拟静电场三维图 与恒定电流场模拟静电场 摘要:本文利用恒定电流场模拟静电场,通过寻找等势点的方法描绘出点电荷对的电力线和电势面 ...

  6. POJ 3095 Linear Pachinko 字符串模拟

    http://poj.org/problem?id=3095 简单字符串模拟 Linear Pachinko Time Limit:1000MSMemory Limit:65536K Descript ...

  7. 如何用matlab画电场强度三维图,浅析matlab模拟静电场三维图与恒定电流场模拟静电场...

    浅析matlab模拟静电场三维图与恒定电流场模拟静电场 1 浅析 Matlab 模拟静电场三维图 与恒定电流场模拟静电场 摘要:本文利用恒定电流场模拟静电场,通过寻找等势点的方法描绘出点 电荷对的电力 ...

  8. 相机模拟激光雷达 建图

    RGBD摄像头实验 除了使用激光雷达进行建图,我们也可以使用深度摄像头模拟激光雷达进行建图. Xtion虚拟激光扫描的角度相对较窄,Xtion一般在57°左右,而一般的激光雷达的扫描范围能达到240° ...

  9. 27.Silverlight二维旋转+平面渐变+动画,模拟雷达扫描图之基本框架

    在现实生活中的雷达运行扫描到物体的某一些属性(比如:速度,频率)超过安全范围值将会报警.在实际的某一些项目中(比如监控系统),我们也想制作一个雷达扫描图来模拟扫描各种设备那么应该如何做呢? 我们将各种 ...

最新文章

  1. PowerDesigner使用教程 —— 概念数据模型详解
  2. python语言句块的标记_Python语言语句块的标记是()
  3. 以往计算机二级c语言填空题,计算机二级C语言考试填空题精选4
  4. 图像处理理论(四)——HOG, Haar, ISP
  5. JQuery快速入门-选择器
  6. 22桥接模式(Bridge Pattern)
  7. 开源大数据周刊-第50期
  8. spingbot 与 activiti 整个 中创建表而找不到表的问题(创建表失败)
  9. 安装Git SCM for Windows
  10. selenium2 原理和常用api
  11. 5WHY分析法 学习笔记
  12. ATX 移动设备共享平台
  13. GAS超标,以太坊告急
  14. import java.util错误_Java“import java.util.Scanner”无效
  15. 网络音视频下载小套路-dy、xmly
  16. 《吊打面试官》系列-Redis基础
  17. 鹏鹏seo第三课:长尾关键词的认识!
  18. 采集微信公众号数据的思路
  19. 详解设置路由导航的两种方法
  20. 全局地址池 与接口地址池

热门文章

  1. python xlrd_python读取excel(xlrd)
  2. node mysql await_javascript – node.js async / await与MySQL一起使...
  3. python字典_python字典可变吗
  4. 【ES10(2019)】JSON扩展 superset / stringify() 增强能力
  5. c# list集合根据某个字段去重_Python list、dataframe去重
  6. Qt实践| HTTP知识点-Qt填充referer请求头盗取图片
  7. Java笔记-重写JsonSerializer中serialize方法使Json中时间戳/1000
  8. Qt工作笔记-undefined reference to `vtable for MyObject'及对moc文件的进一步理解
  9. Django中的日期处理注意事项和自定义时间格式转换
  10. 前端图片有时候能显示有时候不显示_web前端基础教程:两种数据存储思路