题目描述
输入正整数n 以及n个文件名,排序后按列优先的方式左对齐输出。假设最长文件名有M 字符,则最右边有M 字符,其他列都是M+2 字符。
输入样例
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
输出样例
------------------------------------------------------------ 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
实现代码
#include<bits/stdc++.h> using namespace std; int n,M;//M:最大字符串长度 const int maxcol = 60; vector<string> v;//长度不确定,用vector 用固定长度的也行 string str; //输出字符串 void print(string& str1, int len) { cout << str1; for (int i = 0; i < len - str1.size(); i++) {// len:10 str5 5 0-4 cout << " "; } } int main() { while (cin >> n) { for (int i = 0; i < maxcol; i++) { cout << "-" ; } cout << endl; v.clear(); M = 0; for (int i = 0; i < n; i++) { cin >> str; v.push_back(str); M = max(M, (int)str.length()); } sort(v.begin(), v.end()); int cols = (maxcol - M) / (M + 2) + 1;//求一列中元素的个数 因为每列不同所以要分开求 int rows = (n - 1) / (cols)+1; //因为可能只有一行一列,所以得至少有一行. for (int i = 0; i < rows; i++) {//行 for (int j = 0; j < cols; j++)//列 { //行优先: 行号 * rows + 第几列; 列优先: 列号*cols + 第几行 int index = rows * j + i; if (index > v.size()-1) {//如果越界则说明,已经输出完毕,而且是最后一行,后续的index已没有符合题意. break; } print(v[index], j == cols - 1 ? M : M + 2); } cout << endl; } } return 0; }