1324.穷举所有排列
时限:100ms 内存限制:10000K 总时限:300ms
描述
输入一个小于10的正整数n,按把每个元素都交换到最前面一次的方法,输出前n个小写字母的所有排列。
输入
输入一个小于10的正整数n。
输出
按把每个元素都交换到最前面一次的方法,输出前n个小写字母的所有排列。
输入样例
3
输出样例
abc
acb
bac
bca
cba
cab
解析:排列的思想是:如果只有一个数,那么直接输出,如果有n个数,那么取出一个,把剩下的n-1个排列就行,剩下n-1个也一步一步分。书上解释的比较具体,我只记得这样。具体的实现方法是,从第零个开始,每次找到下一个,然后将它与后面的每一个进行交换,做完以他开头的所有排列,然后换回来。遇到等于N就输出。这里注意两个问题,第一个是交换完后要记得换回来,每个都要做一遍开头;第二个是k是从等于i开始的,意思是当前这个也要做头,我写的时候想着直接把这个与后面的每个换即可,结果导致了错误,后来才改正过来。代码如下:
#include <iostream>
using namespace std;
int n;
char a[11]={'a','b','c','d','e','f','g','h','i','j'};
void Swap(int i,int j)
{
char ch;
ch=a[i];
a[i]=a[j];
a[j]=ch;
}
void perm(int i)
{
if(i==n)
{
for(int j=0;j<n;j++)
cout<<a[j];
cout<<endl;
}
else
{
for(int k=i;k<n;k++)//注:k==i开始
{
Swap(i,k);
perm(i+1);
Swap(i,k);
}
}
}
int main()
{
cin>>n;
perm(0);
return 0;
}