日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2025/3/15 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【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表示進入了幾個文件

遇到 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 }

?

轉載于:https://www.cnblogs.com/devilk-sjj/p/9032012.html

總結

以上是生活随笔為你收集整理的【openjudge】【字符串+模拟】1777:文件结构“图”的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。