心胸决定格局,眼界决定境界...

全排列和子串全排列和多层循环的递归

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);

  

posted @ 2019-02-11 17:30  WELEN  阅读(240)  评论(0)    收藏  举报