template<class _BidIt> inline
bool _Next_permutation(_BidIt _First, _BidIt _Last)
{
_BidIt _Next = _Last;
if (_First == _Last || _First == --_Next)
return (false);
for ( ; ; )
{
_BidIt _Next1 = _Next;
if (_DEBUG_LT(*--_Next, *_Next1))
{
_BidIt _Mid = _Last;
for (; !_DEBUG_LT(*_Next, *--_Mid); )
;
_STD iter_swap(_Next, _Mid);
_STD reverse(_Next1, _Last);
return (true);
}
if (_Next == _First)
{
_STD reverse(_First, _Last);
return (false);
}
}
}
이건 간단 명료해서 이해하기 쉬울 거임. 보다시피 재귀를 쓰지 않고 있다.
다른 함수 이름은 명확하게 있으니 뭐 알고리즘은 쉽게 이해하겠지.
(사실 재귀 쓸 이유도 없는게 니가 하려는 건 전체 순열 경우를 구하는 거고
이건 다음 순열을 구하는 거니까 문제가 애초에 다르지.
말하자면 니가 하는건 next_permutation 을 n! 번 루프 돌리는 거)
댓글 0