(相关搜索:程序设计)

描述
壮壮研学结束后,写了一篇英文论文,这篇论文共有N个单词(1≤N≤100),单词之间用空格分隔。
每个单词的长度在1到15之间,仅由大写和小写字母组成。
他想尝试投稿,杂志社给出了一个特殊的排版要求:每一行包含的字符不超过K个(1<= K <=80),空格不计。
请写一个程序,以处理这样的要求,它会按照如下的方式进行排版:
如果壮壮输入了一个单词,这个单词能够放进当前行,就放在当前行;否则,将这个单词放到下一行,然后继续向下一行添加单词;
当然,同一行中的单词之间仍然用一个空格分隔。每一行的结尾都不应当有空格。
输入
输入共两行。
第一行,两个空格分隔的整数N和K。(1 <= N <= 100,1 <= K <= 80)
第二行,包含N个单词,单词之间用单个空格分隔。所有单词的长度都不超过一行中的字符上限数K。
输出
若干行。
按要求输出正确排版的论文。
输入样例 1
10 7
he1lo my name is Zhuang and this is my essay
输出样例 1
hello my
name is
Zhuang
and this
is my
essay
提示
第一行包含7个非空格字符,包括"hello”以及“my"。再加入"name"会使得第一行包含11>7个非空格字符,所以这个单词会被放到下一行。
来源
2023 广西中小学生程序设计挑战赛入门组复赛
语言: C++

#include <stdio.h>
#include <string.h>
int main()
{
    int N, K;
    scanf("%d%d", &N, &K);
    char words[100][100];
    for (int i = 0; i < N; i++)
        scanf("%s", &words[i][0]);
    int pre = 0;
    for (int i = 0; i < N; i++)
    {
        int curr = strlen(words[i]);
        if (pre + curr > K)
        {
            printf("\n%s", words[i]);
            pre = curr;
        }
        else
        {
            if (pre > 0) printf(" ");
            printf("%s", words[i]);
            pre += curr;
        }
    }
    return 0;
}

img

C++代码:

#include <iostream>
#include <cstring>
using namespace std;

int main()
{
    char words[101][82] = { 0 };
    int N, K;
    cin >> N >> K;
    for (int i = 0; i < N; i++)
    {
        cin >> words[i];
    }
    int lineLen = 0; //当前行的长度
    cout << words[0];
    lineLen = strlen(words[0]); //直接输出第一个单词,并记录当前行的长度
    for (int i = 1; i < N; i++)
    {
        int tmp = strlen(words[i]);
        if (lineLen+tmp > K) //每行字符个数超过K
        {
            cout << endl << words[i];
            lineLen = tmp; //更新新行的字符个数
        }
        else
        {
            cout << " " << words[i]; //输出空格和该单词
            lineLen += tmp; //字符个数加上该单词的长度
        }
    }
    return 0;
}

【以下回答由 GPT 生成】

解决方案

这个问题可以通过模拟的方式来解决。我们可以按照要求逐行地排版论文。

下面是解决这个问题的具体步骤:

  1. 读取输入的N和K,表示单词数和每一行的字符数限制。
  2. 读取输入的N个单词,并将它们存储在一个向量中。
  3. 初始化一个空的字符串current_line,用于存储当前行的内容。
  4. 对于每一个单词,做以下操作:
  5. 如果将当前单词加入到current_line中不会导致字符数超过限制K,则将其加入到current_line中,并在单词后面添加一个空格。
  6. 否则,将current_line打印出来作为一行的内容,并清空current_line
  7. 将当前单词加入到current_line中,并在单词后面添加一个空格。
  8. 打印出最后一行的内容current_line

下面是使用C++语言实现的代码:

#include <iostream>
#include <vector>
#include <string>

using namespace std;

int main() {
    int N, K;
    cin >> N >> K;

    vector<string> words(N);
    for (int i = 0; i < N; i++) {
        cin >> words[i];
    }

    string current_line = "";
    for (int i = 0; i < N; i++) {
        if (current_line.length() + words[i].length() <= K) {
            current_line += words[i] + " ";
        } else {
            cout << current_line << endl;
            current_line = words[i] + " ";
        }
    }

    cout << current_line << endl;

    return 0;
}

这个程序首先读取输入的N和K,并创建一个向量来存储N个单词。然后,通过遍历每一个单词,将它们按照要求排版在每一行中。最后,打印出最后一行的内容。

现在我们已经完成了解决方案。如果没有问题,请回答"解决了",否则请详细描述遇到的问题。



【相关推荐】


  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/7674025
  • 除此之外, 这篇博客: C语言实现八大排序算法详解及其性能之间的中的 我们老师给我们花了100个星星的重要,那就是非常重要,快速排序。名字就很嚣张。。。言归正传,快排采用了分治算法。把大问题,分解成小问题。首先我们先找一个基准值,基准值的寻找法,有很多,这里我先用一个取边上值得方法,找到基准值以后呢拿着这个基准值和所有数组比较,使这个数组中比基准值小的都放左边,比基准值大的都放到右边,然后就把原来数组分成三块,中间基准值,左边都是比它小的,右边都是比它大的。然后这两个数组,继续分,一直分。直到他的终止条件,也就是小数组有序了就停止,那么什么时候有序停止呢?小区间长度为1或者长度为0的时候,就是有序了。所有小数组都有序了,那么就是整个数组有序了。只是原理,那么问题,又来了,怎么放左放右呢?我目前会三种。 部分也许能够解决你的问题。

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632