分治法:全排列

集合的全排列问题。
输入样例:
请输入排列数据总个数n:3
请输入数据:

1 2 5

样例输出:
该数据的全排列:

1 2 5
1 5 2
2 1 5
2 5 1
5 2 1
5 1 2

解析:

以[1,2,5,6]为例
1.我们要分别排出 1 [xxx] 2[xxx] 5[xxx] 6[xxx]所以要令每个数字都有机会成为第一位数,即让每个数与第一位数交换
2.把剩下结果依照此情况 [2,5,6] ---->2[xx] 5[xx] 6[xx]依照此循环体不断重复
//[5,6]---->5[x] 6[x]—>[6]---->6 1256
演示第二轮 [6,5]—>6[x]—>[5]—>5 1265
3.因为输出完仍需保持原样 所以需要再交换称原来的样子即:
2[xx]结束后 [2,6,5]—>[2,5,6]—>[5,2,6]—>5[xx]–>[2,6]–>2[x]–>[6]–>6 1526
[2,5,6]—>[5,2,6]—>5[xx]–>[6,2]–>6[x]–>[2]–>2 1562
依次循环!!!

answer:

#include<iostream>

using namespace std;

void swap(int m[],int i, int j)//交换
{
	int temp = m[i];
	m[i]=m[j];
	m[j]=temp;
}

void print(int m[], int n)//输出
{
	int i;
	for(i=0;i<n;i++) cout<<" "<<m[i];
	cout<<endl; 
}

void perm(int m[],int p,int q)//递归
{
	if(p==q)
	{
		print(m,q);
	}
	else{
		for(int i=p;i<q;i++)
		{
			swap(m,p,i);
			perm(m,p+1,q);
			swap(m,p,i);
		}
	}
}

int main()
{
	int n;
	cout<<"请输入排列数据总个数:";
	cin>>n;
	int m[n];
	cout<<"请输入数据:";
	for(int i=0;i<n;i++)
	{		
		cin>>m[i];
	}
	cout<<"该数据的全排列:"<<endl;
	perm(m,0,n);
}

终于搞明白了!!!! 如有不对,请多指教!!!!

猜你喜欢

转载自blog.csdn.net/weixin_44916213/article/details/111499510