找到隐藏的无限循环

时间:2012-06-22 00:09:47

标签: c++

我正在研究this problem,我的解决方案似乎适用于我能想象的每一个案例,并且在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]);}
}

2 个答案:

答案 0 :(得分:1)

这是一篇使用GDB检测无限循环的文章:

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

希望这可以帮助您解决问题。

答案 1 :(得分:0)

嗯......我在这里回答我自己的问题。我用next_permutation重写了它,它更容易,更有效。我仍然没有解决其他解决方案的实际循环问题,但现在我不需要。谢谢大家的提示:)