题意: 模仿 unix的ls命令。 对输入的文件名进行字典序排序, 然后按列优先输出。 除了最后一列, 每列的宽度是所有文件名中最长的那个字符数 + 2。
思路: 用sort()函数(要把字符串封装进结构体里面, 或者用string)把 文件名排序下就行了。 然后根据maxLen 去确定colNum, 根据这个条件:每行最多60个字符。
算法复杂度: o(n)
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define MAX_CHAR 60
#define MAX_N 110
const char *line = "------------------------------------------------------------";
struct filename
{
char name[MAX_CHAR];
};
int cmp(const filename &a, const filename &b)
{
int rslt = strcmp(a.name, b.name);
if (rslt < 0) {
return true;
} else {
return false;
}
}
int main()
{
int n;
while (scanf("%d%*c", &n) == 1) {
filename file[MAX_N];
memset(file, 0, sizeof(file));
// enter
int max = -1;
for (int i = 0; i < n; i++) {
scanf("%s", file[i].name);
int len = strlen(file[i].name);
if (len > max) {
max = len;
}
}
// sort
sort(file, file + n, cmp);
int col = (MAX_CHAR + 2) / (max + 2);
int row = (n - 1) / col + 1;
// output
puts(line);
for (int r = 0; r < row; r++) {
for (int c = 0; c < col; c++) {
if (r + c*row < n) {
printf("%-*s", max + 2, file[r + c * row].name);
}
}
printf("\n");
}
}
return 0;
}