集合之全排列

有六人分别标记为 A, A, B, B, C, C ,输出此六人站队情况。要求:同标记不得连续出现,如:ABACBC (正确);ABABCC (错误)

解决此问题关键点在于:如何输出一个集合的全排列?

当然用循环也是可以做的,不过那样子会显得不那么Elegant。下面给出递归法求解此问题的过程。

递归法

#include <iostream>

using namespace std;

int count = 0;
void swap(char *array, int i, int j);
bool validate(char *array);
void permutation_validate(char *array, int start, int end);

int main(int argc, char *argv[])
{
    char str[] = "AABBCC";
    cout << str << endl;
    cout << "--------" << endl;
    permutation_validate(str, 0, 5);
    cout << "ALL non-repetitive permutation count: " << count/2 << endl;
    return 0;
}

void swap(char *array, int i, int j){
    char temp = 0;
    temp = array[i];
    array[i] = array[j];
    array[j] = temp;

}

bool validate(char *array){
    int i = 0;
    char buff = array[i];
    i++;
    while(array[i] != 0){
        if (buff == array[i])
            return false;
        buff = array[i];
        i++;
    }
    return true;
}

void permutation_validate(char *array, int start, int end){
    if(end < 1){
        return;
    }
    if(start == end){
        if(validate(array)){
            count = count + 1;
            for(int i = 0; i <= end; i++)
                cout << array[i];
            cout << "; ";
        }
    }
    else
    {
        for(int j = start; j <= end; j++){
            swap(array, j, start);
            permutation_validate(array, start+1, end);
            swap(array, j, start);
        }
    }

}
点赞