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