【openjudge】【字符串+模擬】1777:文件結構“圖”
【題目傳送門:】戳
【描述:】
在計算機上看到文件系統的結構通常很有用。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 }
【openjudge】【字符串+模擬】1777:文件結構“圖”