换行算法

转载 2016年05月31日 13:34:01
/* 换行*/
#include<cstdio>
#include<iostream>
#include<cstring>
#include<sstream>
#include<vector>
#define INT_MAX 2147483647
using namespace std;
const int Line_size=45;

void GetWords(const string& text, vector<string>& words_array)//获取单个 词语
{
    string::const_iterator word_begin, word_end;
    word_begin = word_end = text.begin();

    while (word_begin != text.end())
    {
        if (!isgraph(*word_begin))
        {
            ++word_begin;
            ++word_end;
            continue;
        }

        if (isgraph(*word_end))
        {
            ++word_end;
        }
        else
        {
            words_array.push_back(string(word_begin, word_end));
            word_begin = word_end;
        }
    }
}

string WordWarpGreedy(const string& text, int line_size)
{
    int line_space;
    vector<string>::iterator it;

    vector<string> words_array;
    stringstream outstr;

    GetWords(text, words_array);

    for (it = words_array.begin(), line_space = line_size;it != words_array.end(); ++it)
    {
        if ((line_space -= it->length()) >= 0)
        {
            outstr << (*it);
        }
        else
        {
            outstr << '\n' << (*it);
            line_space = line_size - it->length();
        }

        if (line_space)
        {
            outstr << ' ';
            --line_space;
        }
    }

    return outstr.str();
}

inline int CostFunc(const vector<string> words_array, int line_size,unsigned int begin, unsigned int end)
{
    unsigned int i;
    int t, cost;

    for (i = begin, t = 0; i <= end; ++i)
    {
        t += words_array[i].length();
    }

    cost = line_size - (end - begin) - t;

    if (cost < 0)
    {
        return -1;
    }

    return cost * cost;
}
string WordWarpKnuth(const string& text, int line_size)
{
    unsigned int i, j, p;
    int t, min;

    vector<string> words_array;
    stringstream outstr;

    GetWords(text, words_array);

    int cost[words_array.size()];
    int lines[words_array.size()];

    i = 0;
    while(i < words_array.size() && (t = CostFunc(words_array, line_size, 0, i)) >= 0)
    {
        cost[i] = t;
        lines[i++] = 0;
    }

    for(;i < words_array.size(); ++i)
    {
        for(j = i - 1, min = INT_MAX; j > 0; --j)
        {
            t = CostFunc(words_array, line_size, j + 1, i);

            if(t >= 0)
            {
                if(t + cost[j] < min)
                {
                    min = t + cost[j];
                    p = j;
                }
            }
            else
            {
                break;
            }
        }

        cost[i] = min;

        lines[i] = p + 1;
    }

    i = words_array.size() - 1;

    while(i > 0)
    {
        j = lines[i];

        while(i > j)
        {
            lines[i--] = j;
        }

        if(i == 0)
        {
            lines[i] = j;
        }
        else
        {
            lines[i--] = j;
        }
    }

    outstr << words_array[0] << ' ';

    for(i = 1; i < words_array.size(); ++i)
    {
        if(lines[i] != lines[i - 1])
        {
            outstr << '\n';
        }

        outstr << words_array[i] << ' ';
    }

    return outstr.str();
}




int main()
{
    //freopen("cyk.txt","r",stdin);
     //freopen("cyk12.txt","w",stdout);
    string a;
     vector<string> m1;
    getline(cin,a);
    cout<<WordWarpGreedy(a,Line_size);
    return 0;
}
举报

相关文章推荐

换行算法

换行算法/* 换行*/ #include #include #include #include #include #define INT_MAX 2147483647 using namespace ...

UILabel 简单实现自动换行(麻烦看完了给个评论,让我有点成就感)

////////////////////////////////////     UILabel *label = [[[UILabel alloc] initWithFrame:CGRectZero...

精选:深入理解 Docker 内部原理及网络配置

网络绝对是任何系统的核心,对于容器而言也是如此。Docker 作为目前最火的轻量级容器技术,有很多令人称道的功能,如 Docker 的镜像管理。然而,Docker的网络一直以来都比较薄弱,所以我们有必要深入了解Docker的网络知识,以满足更高的网络需求。

CSS自动换行,强迫不换行

自动换行   div{   word-wrap: break-word;   word-break: normal;   }    强迫不换行 ...

Objective-C文字换行方式(解决英文在行末时的换行问题)

我们在做文字信息展示的时候会遇到这种情况:中文+英文(数字),当英文或者数字在行末并且过长的时候,这种情况下系统会默认把整个英文换到下一行展示。这样就会造成上一行显示不满的情况。 如果是UILabe...

使用谷歌翻译pdf内容小技巧——快速替换换行

在看外文论文时少不了使用谷歌翻译,在粘贴过程中由于换行会影响翻译效果。手动将粘贴内容中的换行剔除掉是一件令人烦恼的事情,这里向大家介绍一个小技巧: notepad++是一款免费的文本编辑器,小巧玲珑...

[转载]sed命令替换换行符

sed流编辑器是shell中处理文本内容的一大利器。sed命令从文本流中读取一行文本到模式空间中进行相应的命令、或脚本处理,因此在处理换行符时会有点特殊。 下面的命令可以很正确的执行: ...

并行算法设计--Foster的设计方法论

1  划分 1.1 计算划分 数据划分 1.2 划分质量的评估: a 原始任务数至少比目标并行计算机上的处理器数高一个数量级(如果该条件不能满足的话,则后面的设计将受到很大限制) b...

并行算法的一般设计过程

1. PCAM设计方法学 设计并行算法的四个阶段: 划分(Partitioning):分解成小的任务,开拓并发性 通讯(Communication):确定诸任务间的数据交换,监测划分的合理性; ...

银行家算法说明

银行家算法修订

程序化银行家算法

代码实现银行家算法代码呢,因为我现在一直在写C++代码,而我又觉得这个银行家算法的过程性比较强,所以呢就造就了这个面向过程的程序,C++的底子的程序,因为课设需要,顺便练练手,大约用了两个小时完成这一...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)