求某一整数序列的全排列问题
Time Limit:1000MS Memory Limit:65536K
Total Submit:34 Accepted:15
Description
现有一整数序列如:123,请计算出它的全排列。
Input
输入数据有两行组成,第一行为整数序列的长度,第二行为整数序列,序列元素之间以Tab符相隔。
Output
输出数据为整数序列的全排列,每一个排列单独占一行。
Sample Input
3
1 2 3
Sample Output
123
132
213
231
312
321
Source
参考链接:http://blog.csdn.net/syzcch/article/details/8136218
[Submit] [Go Back] [Status] [Discuss]
#include<iostream>
#include<string>
#include<cstdio>
using namespace std;
void swap(int *p,int*q)
{
int tmp;
tmp=*p;
*p=*q;
*q=tmp;
}
void mknewseq(int *data,int start, int last)
{
while(start<last)
{
swap(&data[start],&data[last]);
start++;
last--;
}
}
void showdata(int *data,int num)
{
int i=0;
for(i=0;i<num;i++)
{
printf("%d",data[i]);
}
printf("\n");
}
int findall(int *data,int num)
{
int i,j;
int lastdata=num-1;
int tmp;
for(i=lastdata;i>0;i--)
{
if(data[i]>data[i-1]) break;
}
if(0==i) return 0;
tmp=i;
for(j=lastdata;j>=i;j--)
{
if((data[j]>data[i-1])&&(data[j]<data[tmp]))
tmp=j;
}
swap(&data[tmp],&data[i-1]);
mknewseq(data,i,lastdata);
return 1;
}
int main()
{
int data[100];
int n;
cin>>n;
for(int i=0;i<n;i++)
cin>>data[i];
showdata(data,n);
while(findall(data,n))
{
showdata(data,n);
}
return 0;
}
//#include "iostream"//这个虽然也能输出全排列,但是会对数字排序,按从小到大输出
//#include "algorithm"
//using namespace std;
//
//void permutation(char* str,int length)
//{
// sort(str,str+length);
// do
// {
// for(int i=0;i<length;i++)
// cout<<str[i];
// cout<<endl;
// }while(next_permutation(str,str+length));
//
//}
//int main(void)
//{
// char str[100];
// int n;
// cin>>n;
// for(int i=0;i<n;i++)
// cin>>str[i];
// permutation(str,3);
// return 0;
//}