일련의 단어가 제공되며 각 줄의 문자 수에는 제한이 있습니다. 줄바꿈을 하여 줄이 선명하게 인쇄되도록 합니다.
일부 행에 많은 추가 공백이 있고 일부 행에 적은 수의 추가 공백이 포함되어 있는 경우 행을 균형을 맞춰야 별도의 행으로 균형이 유지됩니다. 균형을 맞추기 위해 같은 수의 추가 공간을 사용하려고 합니다.
이 알고리즘은 한 줄에 넣을 수 있는 단어 수와 필요한 줄 수를 생성합니다.
입력 및 출력
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