集合的全排列问题。
输入样例:
请输入排列数据总个数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);
}
终于搞明白了!!!! 如有不对,请多指教!!!!