0

「弾丸武器は鎧に対してダメージが少ない」という文字列があります。この文字列は、さまざまな方法でパラメーター int width=20 に基づいて部分に分割する必要があるという条件があります。

1.特定の幅でテキストをラップします。

「弾丸武器は防具に対してダメージが少なくなります。」になる

"Bullet weapons do le"
"ss damage against ar"
"mor."
  1. 特定の幅でテキストを折り返しますが、絶対に必要でない限り、単語は分割されません。

    「弾丸武器は防具に対してダメージが少なくなります。」になる

    "銃弾の武器は防具に対して与えるダメージが"

3.特定の幅でテキストをラップします。絶対に必要でない限り、単語は分割されません。折り返すとき、この関数は線幅をできるだけ均一にしようとします。

"Bullet weapons do less damage against armor." becomes

"Bullet weapons "
"do less damage "
"against armor."

ケース1の場合:次のようにロジックを書きました:

     int len=text.length();   where text is string text= "Bullet weapons do less damage     against armor."

int last=0,first=0;

    vector<string> output;



int max=ceil((double)len/width);
cout<<max<<endl;



for(int i=0;i<max;i++)
{

    first=width*i;
    if(len<(width+(width*i)))
    {
        last=len;
    }
    else
    {
        last=width+(width*i);
    }


    string s(text,first,last);
    output.push_back(s);


}

しかし、それは私に結果を与えています:

弾丸武器は防具に対してダメージを与えません。モル。2行目では、「arに対するssダメージ」までのはずですが、論理的に間違っています。

(2)と(3)の場合はどうでしょうか。

私を助けてください

ありがとう

4

3 に答える 3

0

コンストラクターの 3 番目のパラメーターは、最後の文字のオフセットではなく、構築される文字列の長さです。

于 2013-06-29T03:26:29.897 に答える
0

ケース1:他の人がすでに指摘しているように、あなたの例の文字列コンストラクターは少し間違っており、行は次のようになります:

string s(text,first,width);

ケース 2: 次のように、最大​​許容幅に等しい部分文字列から始めて、空白を逆方向に検索することをお勧めします。

while (!text.empty())
{
    // Search backwards for a space. If we don't find one, break at the
    // maximum width.
    size_t line_width = text.rfind(' ', width - 1);
    if (line_width == string::npos)
    {
        line_width = width;
    }

    string current_line(text, 0, line_width);
    text = text.substr(line_width + 1);

    cout << current_line << endl;
}

ケース 3: この場合、最も規則的な長さの線が得られる幅をどうにかして把握する必要があるようです。これを行う方法はおそらくいくつかありますが、私の頭に浮かぶ解決策は、アルゴリズムを数回実行し、毎回幅を減らし、各行がその幅よりどれだけ短いかを追跡することです (これを「幅」と呼びます)。違い")。解は、合計幅の差が最小の線のセットです。

vector<string> best_line_set;
size_t best_total_width_difference = std::numeric_limits<size_t>::max();

for (j = width; j > 4; --j)
{
    string original_text(text);

    vector<string> current_line_set;
    size_t current_total_width_difference = 0;

    while (!text.empty())
    {
        // Search backwards for a space. If we don't find one, break at the
        // maximum width.
        size_t line_width = text.rfind(' ', j - 1);
        if (line_width == string::npos)
        {
            line_width = j;

            string current_line(text, 0, line_width);
            text = (line_width < text.size())
                ? text.substr(line_width)
                : "";

            current_line_set.push_back(current_line);
        }
        else
        {
            current_total_width_difference += j - line_width;

            string current_line(text, 0, line_width);
            text = (line_width + 1  < text.size())
                ? text.substr(line_width + 1)
                : "";

            current_line_set.push_back(current_line);
        }
    }

    if (current_total_width_difference < best_total_width_difference)
    {
        best_line_set = current_line_set;
        best_total_width_difference = current_total_width_difference;
    }

    text = original_text;
}

最小値 5 を選択したことに注意してくださいj- 最小値が 1 の場合、幅の差の合計が常に 0 であるため、ほぼ常に勝ちます。合計に何らかの「十分な」しきい値を含めることも検討してくださいすでに「十分」なソリューションを改善するために、ループをさらに何度も実行しないでください。

于 2013-06-29T05:31:55.253 に答える