【openjudge】【字符串+模拟】1777:文件结构“图”
【題目傳送門:】戳
【描述:】
在計(jì)算機(jī)上看到文件系統(tǒng)的結(jié)構(gòu)通常很有用。Microsoft Windows上面的"explorer"程序就是這樣的一個(gè)例子。但是在有圖形界面之前,沒有圖形化的表示方法的,那時(shí)候最好的方式是把目錄和文件的結(jié)構(gòu)顯示成一個(gè)"圖"的樣子,而且使用縮排的形式來表示目錄的結(jié)構(gòu)。比如:
ROOT | dir1 | file1 | file2 | file3 | dir2 | dir3 | file1 file1 file2這個(gè)圖說明:ROOT目錄包括三個(gè)子目錄和兩個(gè)文件。第一個(gè)子目錄包含3個(gè)文件,第二個(gè)子目錄是空的,第三個(gè)子目錄包含一個(gè)文件。
【輸入:】
你的任務(wù)是寫一個(gè)程序讀取一些測(cè)試數(shù)據(jù)。每組測(cè)試數(shù)據(jù)表示一個(gè)計(jì)算機(jī)的文件結(jié)構(gòu)。每組測(cè)試數(shù)據(jù)以'*'結(jié)尾,而所有合理的輸入數(shù)據(jù)以'#'結(jié)尾。一組測(cè)試數(shù)據(jù)包括一些文件和目錄的名字(雖然在輸入中我們沒有給出,但是我們總假設(shè)ROOT目錄是最外層的目錄)。在輸入中,以']'表示一個(gè)目錄的內(nèi)容的結(jié)束。目錄名字的第一個(gè)字母是'd',文件名字的第一個(gè)字母是'f'。文件名可能有擴(kuò)展名也可能沒有(比如fmyfile.dat和fmyfile)。文件和目錄的名字中都不包括空格,長(zhǎng)度都不超過30。一個(gè)目錄下的子目錄個(gè)數(shù)和文件個(gè)數(shù)之和不超過30。
【輸出:】
在顯示一個(gè)目錄中內(nèi)容的時(shí)候,先顯示其中的子目錄(如果有的話),然后再顯示文件(如果有的話)。文件要求按照名字的字母表的順序顯示(目錄不用按照名字的字母表順序顯示,只需要按照目錄出現(xiàn)的先后顯示)。對(duì)每一組測(cè)試數(shù)據(jù),我們要先輸出"DATA SET x:",這里x是測(cè)試數(shù)據(jù)的編號(hào)(從1開始)。在兩組測(cè)試數(shù)據(jù)之間要輸出一個(gè)空行來隔開。
你需要注意的是,我們使用一個(gè)'|'和5個(gè)空格來表示出縮排的層次。
?
【算法分析:】
跟去年的d1t2時(shí)間復(fù)雜度有一些像,
使用遞歸模擬,(遞歸常熟大也可以用棧)?
遞歸函數(shù)有一個(gè)參數(shù)hp表示進(jìn)入了幾個(gè)文件
遇到 dir 就 hp+1,遇到 ] 就 hp-1,遇到 * 就return
如果遇到文件的話把文件加入到一個(gè)堆p[hp]中,這就在輸出的時(shí)候保證了文件的字母是按字母表的順序排的
p[i]表示第i層文件夾的文件
?
離線做,先把讀入的一群字符串存到string數(shù)組里,用num[i]表示第i個(gè)文件結(jié)構(gòu)的開始位置
遞歸時(shí)設(shè)置一個(gè)指針t,表示讀到第t行string
每次遞歸或是遇到文件的時(shí)候t就自增1
最后結(jié)束時(shí)把p[1]里的文件輸出
?
【代碼:】
1 //文件結(jié)構(gòu)“圖” 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 }?
轉(zhuǎn)載于:https://www.cnblogs.com/devilk-sjj/p/9032012.html
總結(jié)
以上是生活随笔為你收集整理的【openjudge】【字符串+模拟】1777:文件结构“图”的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 作业:Regular Expressio
- 下一篇: ovs 下流表port 1进入,port