换行算法

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

开源夏令营之foldcolumn工具及解决方案(三)表格列超长自动换行实现

参考:
  • xhu_eternalcc
  • xhu_eternalcc
  • 2014年07月24日 23:34
  • 1088

换行算法

换行算法/* 换行*/ #include #include #include #include #include #define INT_MAX 2147483647 using namespace ...
  • chenyuk1
  • chenyuk1
  • 2016年05月31日 13:34
  • 145

CLion注册码算法逆向分析实录(纯研究)

打算学习cocos2dx,奈何vim只会ggvG,被jetBrains惯坏了,找到了CLion,试了下,果然神器,我等菜鸟正好可以拿来愉快地学习书写c++了。...
  • gsky1986
  • gsky1986
  • 2015年06月24日 13:03
  • 3149

js/jq 自动换行(宽度不可设置时、substring())

文字自动换行(宽度不可设置时,表格也可用) 在项目中遇到了表格但是th无法确定宽度,导致css换行属性无效,所以寻求jq解决,开始时用split()进行分割,但是效果不理想,获取的值有逗号(去不掉...
  • qq_29783621
  • qq_29783621
  • 2016年11月08日 16:10
  • 559

关于edit控件自动换行算法,计算量的问题

我想了想,靠谱的有两种自动换行的算法 1:直接画,画一个字之前计算画完这个字后的长度,如果小于窗口长度,就画,如果大于窗口长度,就另起一行画。 2:在画之前,先计算每一行可以画多少个字,在把这...
  • runzhi5172
  • runzhi5172
  • 2017年01月19日 05:56
  • 79

CSS控制文本自动换行

1.你定死表格的宽度,即给表格一个宽度值(是数值,不是百分比)   2.强制不换行 div{ //white-space:不换行;normal 默认;nowrap强制在同一行内显示所有文本,直到文...
  • tank376574984
  • tank376574984
  • 2014年04月01日 10:37
  • 2912

QRCode二维码总结

QR码生成原理-QR Code(ISO 18004)编码方式 一、什么是QR码 QR码属于矩阵式二维码中的一个种类,由DENSO(日本电装)公司开发,由JIS和ISO将其标准化。QR码的样子其实在...
  • liulina603
  • liulina603
  • 2014年12月23日 10:23
  • 31943

div 长度固定 文字太长实现自动换行

word-break: break-all;white-space: normal;
  • csharp25
  • csharp25
  • 2015年04月23日 22:05
  • 3159

ACM经典算法之字符串处理:字符串截取

语法:mid(char str[],int start,int len,char strback[]) 参数: str[]:操作的目标字符串 start:从第start个字符串开始,截取长度...
  • u012110719
  • u012110719
  • 2014年11月18日 19:29
  • 1034

打印小票时自动换行算法,可处理各种字符混排

这是一个算法,是我在做热敏打印机打印小票时解决的一个问题,想了想还是分享给大家,或许多大家有些许帮助。        在打印小票时,可能遇到一些字符串长度过长的问题,但是你不能直接截取,所以需要自动...
  • xiaoxian8023
  • xiaoxian8023
  • 2012年02月20日 17:04
  • 4259
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:换行算法
举报原因:
原因补充:

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