UVA - 1593 Alignment of Code 纯代码功底

本博客介绍如何解决UVA 1593问题,要求将N行字符串进行处理,使每行的单词竖直对齐且长度最短,无前导或后导空格。解题方法是统计每列单词最大长度,并在输出时用空格填补不足部分。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目大意:给你N行的字符串,要求对这N行字符串进行改装,输出时,原来连续的字符用一个空格隔开,每行的单词竖直对齐,且每行的长度要求达到最短且无前导或者后导空格

解题思路:记录每个字符串的单词的长度,然后用一个数组统计一下每一列的单词的最长长度,输出时,如果单词长度低于该列的最大长度,就用空格补齐

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int MAX_len[200], MAX_num;
struct line{
    char str[200];
    int num[200];
    int len;
}L[1010];

char str[200];
int main() {
    int cnt = 0;    
    memset(MAX_len,0,sizeof(MAX_len));

    while(gets(str)) {
        int num = 0, count = 0, len = strlen(str);
        bool flag = true;
        for(int i = 0; i < len ;i++) {
            if(flag && str[i] == ' ') 
                continue;
            else if(flag && str[i] != ' ') {
                flag = false;
                num++;
                L[cnt].str[count++] = ' ';
                L[cnt].str[count++] = str[i];
            }
            else if(!flag && str[i] != ' ') 
                L[cnt].str[count++] = str[i];
            else if(!flag && str[i] == ' ')
                flag = true;
        }
        L[cnt].str[count] = '\0';
        L[cnt].len = count;
        count = 0, num = 0;
        for(int j = 1; j <= L[cnt].len; j++) {
            if(L[cnt].str[j] == ' ' || j == L[cnt].len) {
                MAX_len[num] = max(MAX_len[num],count);
                count = 0;
                num++;
            }
            else
                count++;
        }
        MAX_num = max(MAX_num,num);
        cnt++;
    }

    for(int i = 0; i < cnt; i++) {
        int cnt = 0, Num = 0, sum = 0;
        for(int j = 1; j < L[i].len; j++) {
            if(L[i].str[j] != ' ') {
                printf("%c",L[i].str[j]);
                cnt++;
                sum++;
            } 
            else {
                for(int k = cnt; k < MAX_len[Num]; k++) {
                    printf(" ");
                    sum++;
                }
                Num++;
                cnt = 0;
                printf(" ");
            }
        }
        printf("\n");
    }

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值