题目:
用C
++
写一个函数, 如 Foo(
const
char
*
str), 打印出 str 的全排列,
如 abc 的全排列: abc, acb, bca, dac, cab, cba
wanfustudio(雁南飞:知识之败,慕虚名不务潜修也) 给出的源码:
void
chang(
char
str[],
int
m)

/**/
/*定义循环左移函数(我没有用左移函数)*/

...
{
int i,j;
char temp=str[0];
for (i=0;i<m;i++) str[i]=str[i+1];
str[i]=temp;
}

void
pai(
char
str[],
int
m,
int
n)
/**/
/*定义全排列函数*/

...
{
int k;
void chang(char str[],int m);

if (m<n) /**//* 定 义 递 归 调 用 出 口 */

...{
for (k=0;k<=m;k++)

...{

pai(str,m+1,n); /**//*递归调用*/

chang(str,m); /**//*调用左移函数*/
}
}
else printf("%s ",str);
}
#include
"
stdio.h
"
main()

...
{char str[]="ABCD";

/**//*全排列字符,可以任意多个(相应的下面排列函数中参数"4"改成全排列字符的个数)*/
clrscr();
pai(str,0,4);

/**//*这里参数0(下标)表示从第一个元素开始,4表示元素个数(不是下标)*/
getch();
}

/**/
/*********************************************/
但在用VC++调试上面这段源码时会发现少量errors和warnings,下面是我调试后的源码,有些自己不知道有什么用的代码就隐去了。
//
用C++写一个函数, 如 Foo(const char *str), 打印出 str 的全排列,
//
如 abc 的全排列: abc, acb, bca, dac, cab, cba
#include
"
stdio.h
"

void
chang(
char
str[],
int
m)

/**/
/*定义循环左移函数(我没有用左移函数)*/

...
{
int i;
char temp=str[0];
for (i=0;i<m;i++) str[i]=str[i+1];
str[i]=temp;
}


void
pai(
char
str[],
int
m,
int
n)
/**/
/*定义全排列函数*/

...
{
int k;
void chang(char str[],int m);

if (m<n) /**//* 定 义 递 归 调 用 出 口 */

...{
for (k=0;k<=m;k++)

...{

pai(str,m+1,n); /**//*递归调用*/

chang(str,m); /**//*调用左移函数*/
}
}
else printf("%s ",str);
}

void
main()

...
{char str[]="ABC";

/**//*全排列字符,可以任意多个(相应的下面排列函数中参数"4"改成全排列字符的个数)*/
//clrscr();
pai(str,0,3);

/**//*这里参数0(下标)表示从第一个元素开始,3表示元素个数(不是下标)*/
//getchar();
}

/**/
/*********************************************/
这是给pcboyxhy(-273.15℃) 出的一个源码:
#include
<
stdio.h
>
#include
<
stdlib.h
>


char
used[
20
]
=
...
{0}
;
int
number[
20
], len, i, p[
20
];

void
output()

...
{
printf(" ");
for(i=0; i<len; ++i)
printf("%d ", number[p[i]]);
}

int
pailie(
int
n)

...
{
int ii;
if(n==len)
output( );

for(ii=0; ii<len; ++ii)

if(!used[ii])...{
used[ii] = 1;
p[n] = ii;
pailie(n+1);
used[ii] = 0;
}
return 0;
}

int
main(
int
argc,
char
*
argv[])

...
{
int index = 0;
scanf("%d", &len);
while(index<len)
scanf("%d", &number[index++]);
pailie(0);
return 0;
}
但只对数字起作用。