集合之全排列

来源:互联网 发布:cosplay服装淘宝 编辑:程序博客网 时间:2024/04/29 17:46

有六人分别标记为 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);        }    }}