题目链接:http://poj.org/problem?id=1057
解释下题意,输入文件系统,dir*就是定义一个文件夹,]就是结束这个文件夹的定义,其中我们观察第2个例子可以看出,每个文件夹里的文件要排序输出,这点要注意
查阅了几篇文章,看到个用vector做的,其中利用了string,不禁感叹,用string表示字符串数组真实太方便了,其中排序,量长度,大小都有函数,总的来说思路算是DFS但是不是搜索,利用递归输入文件,每一次输入新的文件夹,递归输入一次,正好符合题目的输入格式,输出的时候也是,只不过多了个n表示数据层次,方便输出分隔符,也就是|。具体思路看注释把!
至于为什么有两个string头文件,因为我用g++编译的但是用的c++提交,其中这个是没有c的!
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
|
#include <iostream> #include <cstdio> #include <cstring> #include <string> #include <algorithm> #include <vector> using namespace std;
struct node { vector<string> file; vector<node> dir; string name; };
node root;
bool end=0;
void fileinput(node& now) { string temp; while (1) { cin>>temp; if (temp[0]=='#') { end=1; break; } else if(temp[0]=='f') now.file.push_back(temp); else if(temp[0]=='d') { node d; d.name=temp; fileinput(d); now.dir.push_back(d); } else break; } sort(now.file.begin(),now.file.end()); }
void fileprint(node& now,int n) { int i,j; for(i=0;i<n;i++) cout<<"| "; cout<<now.name<<endl; for(i=0;i<(int)now.dir.size();i++) fileprint(now.dir[i],n+1); for(i=0;i<(int)now.file.size();i++) { for(j=0;j<n;j++) cout<<"| "; cout<<now.file[i]<<endl; } }
int main() { int i; for(i=1;;i++) { node root; root.name="ROOT"; fileinput(root); if(end) break; cout<<"DATA SET "<<i<<":"<<endl; fileprint(root,0); cout<<endl; } }
|