换行算法

转载 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;
}

相关文章推荐

遍历换行算法(table里面循环tr,td,灵活处理行和列)

0) { h++; } int j = 0; for (int k = 0; k < h; k++) { %>

button自适应高度和自动换行

  • 2016年07月14日 17:37
  • 74KB
  • 下载

UILabel换行与多行文字显示处理

最近在项目中频繁遇到显示多少行文字的需求,有的需求是在什么情况下都只显示1行文字,有的需求是要求显示多少行文字由服务器端控制,有的需求是展示全部文字,有的需求是要最多展示5行文字,不过他们有一个共同的...
  • ShorewB
  • ShorewB
  • 2016年07月31日 22:00
  • 3373

换行对齐自定义TextView

  • 2017年04月22日 11:44
  • 2KB
  • 下载

阳历阴历换行

  • 2015年01月19日 11:17
  • 21KB
  • 下载

解决bootstrap row span设置border换行的问题

Hadoop方面的毕业设计告一段落了,趁这几天空闲时间认真学习一下之前常使用但是却没用好的Bootstrap。 本文记录Bootstrap框架使用栅格系统时,遇到row内的span设置border换...

换行的RadioGroup可以使用

  • 2017年08月25日 11:29
  • 107KB
  • 下载

统计空格与换行

  • 2013年11月24日 20:16
  • 256B
  • 下载

cocos2dx中RichText富文本的换行问题

cocos2dx中RichText富文本的换行问题
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:换行算法
举报原因:
原因补充:

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