int out[1000];
void perputation(int n, int cur)
{
if (cur == n)
{
for (int i = 0; i < n; i++)
cout << out[i];
cout << endl;
}
else
{
for (int i = 1; i <= n; i++)
{
int ok = 1;
for (int j = 0; j < cur; j++)//如果是每个位置都能出现1~n的值,则不需要下面的判断
{//每个数值在排列中出现的次数不能超过其在原串中出现的次数
if (out[j] == i)//是否之前出现过
{
ok = 0;//和后面的perputation_vector 如出一辙
}
}
if (ok)
{
out[cur] = i;
perputation(n, cur + 1);
}
}
}
}
void perputation_vector(int* data, int n, int cur)
{
static int global_num = 1;
if (cur == n)
{
cout << global_num << ":";
for (int i = 0; i < n; i++)
cout << out[i];
cout << endl;
global_num++;
}
else
{
for (int i = 0; i < n; i++)
{
//1 2(1) 2(2)
//递归
// 2(1) 2(2)
// 2(1) 2(1)
// 2(2) 2(1)
// 2(2) 2(2)
//如果数组中有重复的元素,则输出的排列中也会重复
//表示不会出现重复元素递归
//data[i] != data[i - 1] 表示每个位置, 每个数值第一次出现,是允许的,后面再次遍历出现不允许
//例如第三个位置,遍历每个值时,1可以,2(1)可以,2(2)再次出现不可以
if (i == 0 || data[i] != data[i - 1])//表示不会出现重复元素递归
{
int c0 = 0;
int c1 = 0;
for (int j = 0; j < n; j++)
{
if (data[j] == data[i])
{
c0++;
}
}
for (int j = 0; j < cur; j++)
{
if (out[j] == data[i])
{
c1++;
}
}
if (c1 < c0)//每个元素出现的次数不能超过原有子串本身
{
out[cur] = data[i];
perputation_vector(data, n, cur + 1);//每个位置,遍历数组中的每个元素; 所以有可能多个位置会重复选一个元素
}
}
}
}
}
int main(int argc, const char* argv[])
{
//1~n的全排列
//perputation(2, 0);
//一个子序列(该子序列可以出现重复数字)的全排列
int data[] = { 2, 1, 2, 3, 3};
sort(data, data+sizeof(data)/sizeof(int)-1);//排序
for (int i = 0; i < sizeof(data) / sizeof(int); i++)
cout << data[i];
cout << endl;
perputation_vector(data, 5, 0);
cout << endl;
cout << "STL:" << endl;
int num = 1;
//使用STL next_perputaion
do
{
cout << num << ":";
for (int i = 0; i < sizeof(data) / sizeof(int); i++)
cout << data[i];
cout << endl;
num++;//注意 sort(data, data+len(data))
//next_permutation 也是一样的
} while (next_permutation(data, data + 5));//include<algorithm>
//多层循环的递归 此处中,以3个变量的循环作为例子
void circle(int* data, int n, int cur)
{
static int global_num = 1;
if (cur == n)
{
cout << global_num << ":";
for (int i = 0; i < n; i++)
{
if (i == 0)
{
cout <<"i = "<< out[i] << ",";
}
else if(i == 1)
{
cout << "j = " << out[i] << ",";
}
else
{
cout << "k = " << out[i] << ",";
}
}
cout << endl;
global_num++;
}
else
{
for (int i = 1; i <= data[cur]; i++)
{
out[cur] = i;
circle(data, n, cur + 1);
}
}
}
//多层循环的递归
circle(data_set, 3, 0);