对于求一个全排列的问题,我们不可能一下子列出所有排列的情况(n!种情况),
我们可以从一个已知的排列,来获得下一个排列。对于任意的一个排列,他的下一个排列是什么了?
比如说:453987621,我的想法是:
从该排列的右边向左边遍历,找到第一个比其右边小的数,此处是
3(3<9),然后遍历3右边的数字,找到比他大的最小的数字,此处为6,
将3与6交换,排列变为456987321,最后将6
后面的数字逆序即可,(987321变成123789),所以得到的下一个
排列为456123789。
开始时我们初始化为123456789,最后判断得到987654321的排列,则得到了所有的全排列。
代码如下:
#include
<
iostream
>
using namespace std;
void init( int * a, int n);
void _swap( int & i, int & j);
void inverse( int * a, int startpos, int n);
int main( int )
{
int a[100] =
using namespace std;
void init( int * a, int n);
void _swap( int & i, int & j);
void inverse( int * a, int startpos, int n);
int main( int )
{
int a[100] =