题目大意
输入一个数字n,紧接n行每行一个单词。
要求输出60个'-',随后要求用最少行输出单词,其中设单词最长有M个字符,则最后一列有M个字符,其他行都有M+2个字符。
分析
这道题想明白了十分简单,或许最困难的地方是行列数的确定。其实题目中给出了明确的要求
- 最少的行列
- 由60个字符构成
那么这道题就有思路了,我们可以求出最长单词的长度,随后就可以根据最后一列有M个字符,其他行都有M+2个字符求出来有多少列,进而就能求出来有多少行。
#include<vector>
#include<cmath>
#include<algorithm>
#include<iostream>
using namespace std;
int main() {
int n = 0;
string str;
vector<string> filenames;
while (cin>>n)
{
filenames.clear();
int m = 0;
for (int i = 0; i < n; i++)
{
cin >> str;
filenames.push_back(str);
m = max(m, (int)str.length());
}
int cols = (60 - m) / (m + 2) + 1;
int rows = (n - 1) / cols + 1;
for (int i = 0; i < 60; i++)
{
cout << "-";
}
cout << endl;
sort(filenames.begin(), filenames.end());//按照首字母排序
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < cols; j++)
{
//输入都是一行一行输出的
int idx = rows * j + i;
if (idx<n)
{
cout << filenames[idx];
int max_length = j == cols - 1 ? m : m + 2;
int blank_length = max_length - filenames[idx].length();
for (int k = 0; k <blank_length;k++)
{
cout << " ";
}
}
}
cout << endl;
}
}
}