전체 출력

#include #include using namespace std; template < type: name T > / * 는 오름차 순 의 배열 (물론 내림차 순 으로 도 가능) 을 현재 배열 로 시작 한 다음 현재 배열 의 다음 사전 순 서 를 순서대로 계산 합 니 다.현재 배열 을 뒤에서 앞으로 스 캔 하고 오름차 순 으로 인접 한 요 소 를 찾 아 i 와 j (i < j) 로 기록 합 니 다.만약 에 이러한 오름차 순 으로 인접 한 요소 가 존재 하지 않 는 다 면 모든 배열 을 찾 았 고 알고리즘 이 끝 났 습 니 다.그렇지 않 으 면 현재 배열 을 뒤에서 스 캔 하고 i 보다 큰 첫 번 째 요소 k 를 찾 아 i 와 k 를 교환 한 다음 에 j 부터 끝 난 하위 서열 에 반전 시 키 면 이때 얻 은 새로운 배열 은 다음 사전 순서 로 배열 된다.이러한 방식 으로 이 루어 진 모든 배열 은 사전 순서에 따라 질서 가 있 는데 이것 도 C + STL 알고리즘 next 이다.permutation 의 사상.알고리즘 은 다음 * / / 사전 순서 void CalcAllPermutation (T perm [], int num) / / num 을 배열 에 있 는 요소 의 개수 {if (num < 1) return; while (true) {int i; for (i = num - 2; i > = 0; i) {if (perm [i] < perm [i + 1]) / 오른쪽 에서 왼쪽으로 첫 번 째 상승 서열 break 를 찾 습 니 다.} if (i < 0) break; / 모든 배열 int k 를 찾 았 습 니 다. for(k = num - 1; k > i; -- k) / / / 오른쪽 에서 왼쪽으로 첫 번 째 perm [i] 보다 큰 숫자 {if (perm [k]] > perm[i]]]]]]] break;} swa(perm [i]], perm[k]]] 를 찾 습 니 다. / / / 리 버스 (perm + i + 1, perm + num); / / 역 돌 이 켜 보기} / / / / 재 귀적 void CalcAllPermution R (int perm [], int perm [], int s, int e) {if (s > = e) {/ / / / / / / retretret;} for (int i = i = s; i < e = i < e = i < e = i = e; i < < e = i = e; i < < <; i + +) {swap (perm [i], perm [s]); CalcAllPermutation_R(perm, s+1,e) ; swap(perm[i],perm[s]); } } int main() { const int NUM = 12; char perm[NUM]; for (int i = 0; i < NUM; ++i) perm[i] = 'a' + i; CalcAllPermutation(perm, NUM); }
문자열 의 조합:
   :       ,              。    ,    abc,     a、b、c、ab、ac、bc、abc。

                   。

         n      m      。                。       ,       :             ,           n-1      m-1   ;              ,           n-1      m   。              。            :

void Combination(char* string)

{

    if(string == NULL)

        return;

 

    int length = strlen(string);

    vector<char> result;

    for(int i = 1; i <= length; ++ i)

    {

        Combination(string, i, result);

    }

}

 

void Combination(char* string, int number, vector<char>& result)

{

    if(number == 0)

    {

        vector<char>::iterator iter = result.begin();

        for(; iter < result.end(); ++ iter)

            printf("%c", *iter);

        printf("
"); return; } if(*string == '\0') return; result.push_back(*string); Combination(string + 1, number - 1, result); result.pop_back(); Combination(string + 1, number, result); } 1 ,2 …… n , void Combination(char* string), for 。 , vector : , 2 , 1, , 0 , 。

좋은 웹페이지 즐겨찾기