UVA 400 - Unix ls (Unixls命令)
csdn : https://blog.csdn.net/su_cicada/article/details/86773007
例題5-8 Unixls命令(Unix ls,UVa400) 輸入正整數n以及n個文件名,按照字典序排序後按列優先的方式左對齊輸出。 假設最長文件名有M字符,則最右列有M字符,其他列都是M+2字符。
Sample Input
10
tiny
2short4me
very_long_file_name
shorter
size-1
size2
size3
much_longer_name
12345678.123
mid_size_name
12
Weaser
Alfalfa
Stimey
Buckwheat
Porky
Joe
Darla
Cotton
Butch
Froggy
Mrs_Crabapple
P.D.
19
Mr._French
Jody
Buffy
Sissy
Keith
Danny
Lori
Chris
Shirley
Marsha
Jan
Cindy
Carol
Mike
Greg
Peter
Bobby
Alice
Ruben
Sample Output
------------------------------------------------------------ 12345678.123 size-1 2short4me size2 mid_size_name size3 much_longer_name tiny shorter very_long_file_name ------------------------------------------------------------ Alfalfa Cotton Joe Porky Buckwheat Darla Mrs_Crabapple Stimey Butch Froggy P.D. Weaser ------------------------------------------------------------ Alice Chris Jan Marsha Ruben Bobby Cindy Jody Mike Shirley Buffy Danny Keith Mr._French Sissy Carol Greg Lori Peter
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=341
[註意] 一行最後一個單詞後面不要有兩個空格
[註意] 每組最後一個單詞後面不用空2格
算行數時向上取整
輸出時,設置額外的break條件,即已經輸出完最後一個,不要繼續越界輸出
其余看代碼
#include<iostream> #include<vector> #include<string> #include<algorithm> #include<cmath> using namespace std; /* [註意] 一行最後一個單詞後面不要有兩個空格 [註意] 每組最後一個單詞後面不用空2格 算行數時向上取整 輸出時,設置額外的break條件,即已經輸出完最後一個,不要繼續越界輸出 */ int main() { int N; while(cin>>N){ vector<string> list; int max_len = 0; for(int i=0;i<N;i++){ string str; cin>>str; max_len = max_len < str.size() ? str.size() : max_len; list.push_back(str); } sort(list.begin(), list.end()); int count_col = 0; // 列數 int count_line = 0; //行數 count_col = (60+2) / (max_len+2); count_line = ceil((double)list.size() / count_col); //[註意]這裏除的時候要轉換為浮點型 // cout<<list.size()<<" "<<(double)list.size() / count_col + 0.5<<endl; // cout<<max_len<<" "<<count_col<<" "<<count_line<<endl; for(int i=0;i<60;i++) cout<<"-"; cout<<endl; for(int i=0;i<count_line;i++){ // 第幾行 for(int k=0; k<count_col && (i+k*count_line)<list.size(); k++){ // 第幾列, 循環判斷條件中,加上判輸出單詞個數足夠 if(k>0) //作為兩個詞塊之間間隔的空格,每行第一個之前沒有 cout<<" "; string out = list[i+k*count_line]; cout<<out; //輸出每個單詞後面的占位空格 (不算單詞塊之間2個空格的間隔) for(int j=0;j<max_len-out.size();j++) cout<<" "; } cout<<endl; } } return 0; } // AC at 2019/2/2 00:22
沒什麽難度,註意註意點就行, 感謝 udebug
https://www.udebug.com/UVa/400
UVA 400 - Unix ls (Unixls命令)