pat 团体天梯赛 L1-039. 古风排版

L1-039. 古风排版

时间限制
400 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
陈越

中国的古人写文字,是从右向左竖向排版的。本题就请你编写程序,把一段文字按古风排版。

输入格式:

输入在第一行给出一个正整数N(<100),是每一列的字符数。第二行给出一个长度不超过1000的非空字符串,以回车结束。

输出格式:

按古风格式排版给定的字符串,每列N个字符(除了最后一列可能不足N个)

输入样例:
4
This is a test case
输出样例:
asa T
st ih
e tsi
 ce s

思路:排版,找规律。
遍历字符串,设字符串第i个字符为s[i].k为排版后每一列的字符数
当0<=i<=k-1时 s[i]放置在排版方阵的最后1列第i行
当k<=i<=2*k-1时 s[i]放置在方阵倒数第2列的第(i-k)行
...
当a*k<=i<=(a+i)k-1时 s[i]放置在方阵倒数(a+1)列第(i-ak)行
最后排版后的方阵第一列可能元素没有补满,可以事先把字符串用空格补足再排版。
AC代码:
#define _CRT_SECURE_NO_DEPRECATE
#pragma warning(disable:4996)
#include<iostream>
#include<string>
#include<algorithm>
#include<map>
#include<cctype>
#include<cmath>
#include<cstring>
#include<vector>
using namespace std;
#define N_MAX 100+20
int k;
char paint[N_MAX][N_MAX];
int main() {
    while (cin>>k) {
        string s; getchar(); getline(cin, s);
        int cols = (s.size() % k == 0) ? (s.size() / k) : (s.size() / k + 1);
        while (s.size() < cols*k) {//排版后第一列若缺字符,补足
            s += ' ';
        }
        for (int i = 0; i < s.size();i++) {
            int a = i / k;
            paint[i - a*k][cols-(a + 1)] = s[i];
        }    
        for (int i = 0; i < k;i++) {
            for (int j = 0; j < cols;j++) {
                cout << paint[i][j];
            }
            cout << endl;
        }
    }
    return 0;
}

 

posted on 2018-03-25 22:36  ZefengYao  阅读(274)  评论(0编辑  收藏  举报

导航