2012-06-22 9 views
2

나는 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; 
} 

은 * * 여기

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

'std :: next_permutation'을 사용할 수 없다고 추측하겠습니다. – chris

+0

실제 컴파일러/디버거 쌍을 가져 와서 직접 찾으시겠습니까? –

+3

@chris : 당신이 똑같은 크리스이 아니란 걸 깨닫기 위해 잠시 나 걸렸습니다. –

답변

0

음 ... 여기 내 자신의 질문에 대답하겠습니다. 나는 next_permutation으로 그것을 다시 썼고, 훨씬 더 쉽고 효율적이었다. 나는 여전히 다른 해결책으로 실제 루핑 문제를 해결하지 못했지만 지금은 할 필요가 없다. 팁을 주신 모든 분들께 감사드립니다.

1

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; 
} 

은 GDB하여 무한 루프를 검색하는 문서이다

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

잘하면이 문제를 해결하는 데 도움이됩니다.

+2

잠깐 동안 나는 누군가가 멈추는 문제를 해결할 것을 제안했다고 생각했다 : D –

+0

아니, 단순한 기사. –