[面试常见题系列] 打印1,2,3,..,n的全排列
思路:递归算法
前0..cur-1位置上已经排好,当前cur位置取一个和前面都不一样的,然后递归处理后面的。
/*
输出1,2,3,..,n的排列数
*/
#include < stdio.h >
#include < assert.h >
#include < malloc.h >
void p( int n)
{
extern void _p( int n, int cur, int * a);
int * a;
a = ( int * ) malloc(n * sizeof ( int ));
assert(a != NULL);
_p(n, 0 , a);
free(a);
}
void _p( int n, int cur, int * a)
{
int i,j;
if (cur == n)
{
for (j = 0 ; j < cur; j ++ )
{
printf( " %d " , a[j]);
}
printf( " \n " );
return ;
}
for (i = 1 ; i <= n; i ++ )
{
for (j = 0 ; j < cur; j ++ )
{
if (a[j] == i)
{
break ;
}
}
if (j >= cur)
{
a[cur] = i;
_p(n, cur + 1 , a);
}
}
}
int main()
{
p( 3 );
}
#include < stdio.h >
#include < assert.h >
#include < malloc.h >
void p( int n)
{
extern void _p( int n, int cur, int * a);
int * a;
a = ( int * ) malloc(n * sizeof ( int ));
assert(a != NULL);
_p(n, 0 , a);
free(a);
}
void _p( int n, int cur, int * a)
{
int i,j;
if (cur == n)
{
for (j = 0 ; j < cur; j ++ )
{
printf( " %d " , a[j]);
}
printf( " \n " );
return ;
}
for (i = 1 ; i <= n; i ++ )
{
for (j = 0 ; j < cur; j ++ )
{
if (a[j] == i)
{
break ;
}
}
if (j >= cur)
{
a[cur] = i;
_p(n, cur + 1 , a);
}
}
}
int main()
{
p( 3 );
}