f(sixleaves) = sixleaves

重剑无锋 大巧不工

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  95 随笔 :: 0 文章 :: 7 评论 :: 0 Trackbacks
题目其实很简单,答题意思就是从管道读取一组文件名,并且按照字典序排列,但是输入的时候按列先输出,再输出行。而且每一行最多60个字符。而每个文件名所占的宽度为最大文件名的长度加2,除了输出在最右边的文件名的宽度是最大文件名长度之外。编程实现这个功能,这就是Unix系统下ls命令的一部分而已。具体实现如下。
主要学习的技能要点就是如何用偏移位移法来按列输出。如果一个矩阵n行m列,要按照列输出。但是我们知道,编程时候,只能是for(行)在列。所以必须要有一个偏移量来计算这种偏移关系。x = rows * c + r;

 1 #include <iostream>
 2 #include <string>
 3 #include <algorithm>
 4 #include <vector>
 5 #include <cmath>
 6 
 7 using namespace std;
 8 
 9 vector<string> words;
10 void print(const string &s, int len, char extra);
11 int main() {
12     
13     
14     int n;
15     string w;
16     
17     while (cin >> n) {
18         
19         int max = 0;
20         words.clear();
21         for (int i = 0; i < n; i++) {
22             cin >> w;
23             string::size_type str_size = w.size();
24             if (str_size > max) max = str_size;
25             words.push_back(w);
26         }
27         int cols = (60 - max) / (max + 2) + 1;
28         int rows = ceil(double(n) / cols);
29         sort(words.begin(), words.end());
30         print("", 60, '-');
31         cout << endl;
32         for(int r = 0; r < rows; r++) {
33             
34             for (int c = 0; c < cols; c++) {
35                 
36                 int idx = c * rows + r;
37                 if (idx < n) print(words[idx],(c == cols - 1? max: max + 2), ' ');
38                 
39             }
40             
41             cout << endl;
42             
43         }
44         
45         
46     }
47     
48     return 0;
49     
50 }
51 
52 void print(const string &s, int len, char extra) {
53     
54     cout << s;
55     string::size_type str_size = s.size();
56     for (int i = 0; i < len - str_size; i++) {
57         cout << extra;
58     }
59 }
posted on 2015-03-25 14:32 swp 阅读(138) 评论(0)  编辑 收藏 引用 所属分类: algorithm

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理