自动换行问题

给出了一个单词序列,每行的字符数有限制。通过放置换行符,以使打印线清晰可见。

这些行必须平衡,当某些行具有很多额外的空间并且某些行包含少量额外的空间时,它将平衡它们到单独的行。它尝试使用相同数量的额外空间来使它们平衡。

该算法将产生一行中可以放置多少个单词,以及需要多少行。

输入输出

Input:

The length of words for each line. {3, 2, 2, 5}. The max width is 6.

Output:

Line number 1: Word Number: 1 to 1 (only one word)

Line number 2: Word Number: 2 to 3 (Second and 3rd word)

Line number 3: Word Number: 4 to 4 (4th word)

算法

wordWrap(wordLenArr, size, maxWidth)

输入- 单词长度数组,数组大小和单词的最大宽度。

输出- 每行将放置多少个单词的列表。

Begin

   define two square matrix extraSpace and lineCost of order (size + 1)

   define two array totalCost and solution of size (size + 1)

   for i := 1 to size, do

      extraSpace[i, i] := maxWidth – wordLenArr[i - 1]

      for j := i+1 to size, do

         extraSpace[i, j] := extraSpace[i, j-1] – wordLenArr[j - 1] - 1

      done

   done

   for i := 1 to size, do

      for j := i+1 to size, do

         if extraSpace[i, j] < 0, then

            lineCost[i, j] = ∞

         else if j = size and extraSpace[i, j] >= 0, then

            lineCost[i, j] := 0

         else

            linCost[i, j] := extraSpace[i, j]^2

      done

   done

   totalCost[0] := 0

   for j := 1 to size, do

      totalCost[j] := ∞

      for i := 1 to j, do

         if totalCost[i-1] ≠∞ and linCost[i, j] ≠ ∞ and

            (totalCost[i-1] + lineCost[i,j] < totalCost[j]), then

            totalCost[i – 1] := totalCost[i – 1] + lineCost[i, j]

            solution[j] := i

      done

   done

   display the solution matrix

End

示例

#include<iostream>

using namespace std;

int dispSolution (int solution[], int size) {

   int k;

   if (solution[size] == 1)

      k = 1;

   else

      k = dispSolution (solution, solution[size]-1) + 1;

   cout << "Line number "<< k << ": Word Number: " <<solution[size]<<" to "<< size << endl;

   return k;

}

void wordWrap(int wordLenArr[], int size, int maxWidth) {

   int extraSpace[size+1][size+1];

   int lineCost[size+1][size+1];

   int totalCost[size+1];

   int solution[size+1];

   for(int i = 1; i<=size; i++) {    //find extra space for all lines

      extraSpace[i][i] = maxWidth - wordLenArr[i-1];

      for(int j = i+1; j<=size; j++) {    //extra space when word i to j are in single line

         extraSpace[i][j] = extraSpace[i][j-1] - wordLenArr[j-1] - 1;

      }

   }

   for (int i = 1; i <= size; i++) {    //find line cost for previously created extra spaces array

      for (int j = i; j <= size; j++) {

         if (extraSpace[i][j] < 0)

            lineCost[i][j] = INT_MAX;

         else if (j == size && extraSpace[i][j] >= 0)

            lineCost[i][j] = 0;

         else

            lineCost[i][j] = extraSpace[i][j]*extraSpace[i][j];

      }

   }

   totalCost[0] = 0;

   for (int j = 1; j <= size; j++) {    //find minimum cost for words

      totalCost[j] = INT_MAX;

      for (int i = 1; i <= j; i++) {

         if (totalCost[i-1] != INT_MAX && lineCost[i][j] != INT_MAX && (totalCost[i-1] + lineCost[i][j] < totalCost[j])){

            totalCost[j] = totalCost[i-1] + lineCost[i][j];

            solution[j] = i;

         }

      }

   }

   dispSolution(solution, size);

}

main() {

   int wordLenArr[] = {3, 2, 2, 5};

   int n = 4;

   int maxWidth = 6;

   wordWrap (wordLenArr, n, maxWidth);

}

输出结果

Line number 1: Word Number: 1 to 1

Line number 2: Word Number: 2 to 3

Line number 3: Word Number: 4 to 4

以上是 自动换行问题 的全部内容, 来源链接: utcz.com/z/327127.html

回到顶部