1. 程式人生 > >【openjudge】【字符串+模擬】1777:文件結構“圖”

【openjudge】【字符串+模擬】1777:文件結構“圖”

不用 第一個 LG cstring \n 函數 算法分析 參數 i++

【題目傳送門:】戳

【描述:】

在計算機上看到文件系統的結構通常很有用。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表示進入了幾個文件

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

如果遇到文件的話把文件加入到一個堆p[hp]中,這就在輸出的時候保證了文件的字母是按字母表的順序排的

p[i]表示第i層文件夾的文件

離線做,先把讀入的一群字符串存到string數組裏,用num[i]表示第i個文件結構的開始位置

遞歸時設置一個指針t,表示讀到第tstring

每次遞歸或是遇到文件的時候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 }

【openjudge】【字符串+模擬】1777:文件結構“圖”