2

私はこの問題に取り組んでおり、私の解決策は、私が試してみると想像できるすべてのケースで機能するようで、3 秒の時間制限を十分に下回っていますが、オンラインで送信すると、まだ 3 秒を超えています。このwhileループが無期限に続く場合があるに違いないと思います:

while (!equals(availableChars, testChars)){
        next = getNextAlphaString(high, next, availableChars, it);      
        fillCharSet(next, testChars);       
    }

しかし、私は自分の機能をたくさんテストしましたが、それが何であるかを理解できません...皆さんが何かを見てくれることを願っています. ヘルパー関数は次のとおりです。

bool equals(multiset<char>& availableChars, multiset<char>& test){  
    multiset<char>::iterator it;
    for (it = availableChars.begin(); it != availableChars.end(); it++){
        if ((int)availableChars.count(*it) != (int)test.count(*it)) return false;
    }
    return true;
}

*

string getNextAlphaString(char& high, string next, multiset<char>& availableChars, multiset<char>::iterator& it){   
for (int i=next.size()-1; i>=0; i--){

    if (next[i] != high){
        it = availableChars.find(next[i]); 
        while(*it == next[i]){
            it++;           
            if (it == availableChars.end()){it = availableChars.begin(); break;}
        }
        next[i] = *it;
        break;}
    else{
        it = availableChars.begin();
        next[i] = *it;
    }       
}
return next;
}

*

void fillCharSet(string in, multiset<char>& chars){
    chars.clear();
    for (int i=0; i<in.size(); i++){chars.insert(in[i]);}
}
4

2 に答える 2

1

GDB を使用して無限ループを検出する記事は次のとおりです。

http://www.unknownroad.com/rtfm/gdbtut/gdbinfloop.html

うまくいけば、これは問題の解決に役立ちます。

于 2012-06-22T00:30:10.697 に答える
0

さて...ここで私は自分の質問に答えます。next_permutation で書き直したところ、非常に簡単で効率的になりました。私はまだ他のソリューションで実際のループの問題を解決していませんが、今は必要ありません。ヒントをくれてありがとう:)

于 2012-06-23T00:29:07.943 に答える