《算法竞赛入门经典2ndEdition 》例题5-8 Unix is 命令(Unix is, Uva400)

这题也就只能算是个STL小练习吧,没有任何思维上难度,
还是比较简单的,(虽然我的程序还是没有刘汝佳的简洁。。。,表示依旧没有这样把一些步骤定义成函数的习惯)直接放代码吧。

#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
#include <iostream>
#include <cmath>
using namespace std;

vector<string> s; 

int main()
{
  freopen("New Text Document.txt","r",stdin);
  freopen("Output.txt","w",stdout);
  ios::sync_with_stdio(false);
  int n;
  string str;
  while(cin>>n)
  {
    cout<<"------------------------------------------------------------"<<endl;
    cin.get();
    int max = 0;
    s.clear();
    for(int i = 0; i < n; i++)
    { 
      getline(cin, str);
      s.push_back(str);
      //cout<<str<<endl;
      if(str.length() > max) max = str.length();
    }
    int row = (60+2) / (max+2);
    sort(s.begin(), s.end());
    int line = s.size() / row;
    if(line*row != s.size()) line++;
    for(int i = 1; i <= line; i++)
    {
      for(int j = 1 ; j <= row; j++)
      {
        int pos = (j-1)*line+i;
        if(pos-1<s.size()) 
        {
          cout<<s[pos-1];
          for(int i = s[pos-1].length(); i < max; i++) cout<<" ";
        } 
        if(j!=row) cout<<"  ";
      }
      cout<<endl;
    }
  }
  return 0;
} 

下面是刘汝佳标程。

// UVa400 Unix ls
// Rujia Liu
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;

const int maxcol = 60;
const int maxn = 100 + 5;
string filenames[maxn];

// 输出字符串s,长度不足len时补字符extra
void print(const string& s, int len, char extra) {
  cout << s;
  for(int i = 0; i < len-s.length(); i++)
    cout << extra;
}

int main() {
  int n;
  while(cin >> n) {
    int M = 0;
    for(int i = 0; i < n; i++) {
      cin >> filenames[i];
      M = max(M, (int)filenames[i].length());
    }
    // 计算列数cols和行数rows
    int cols = (maxcol - M) / (M + 2) + 1, rows = (n - 1) / cols + 1;
    print("", 60, '-');
    cout << "\n";
    sort(filenames, filenames+n);
    for(int r = 0; r < rows; r++) {
      for(int c = 0; c < cols; c++) {
        int idx = c * rows + r;
        if(idx < n) print(filenames[idx], c == cols-1 ? M : M+2, ' ');
      }
      cout << "\n";
    }
  }
  return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值