33,008
社区成员
发帖
与我相关
我的任务
分享
void Perm(char list[], int k, int m);
int total = 0 ;
int _tmain(int argc, _TCHAR* argv[])
{
char s[]="34567";
Perm(s,0,4);
printf("%d",total);
char b;
scanf(&b);
return 0;
}
void Swap(char* a, char* b)
{// 交换a和b
char temp;
temp = *a;
*a = *b;
*b = temp;
}
bool isTrack(char list[], int k, int m){
if(m>k+1){
for(int i = k+1;i<m;i++){
if(list[i] == list[m])
return true;
}
}
return false;
}
void Perm(char list[], int k, int m)
{ //生成list [k:m ]的所有排列方式
int i;
if (k == m) {//输出一个排列方式
for (i = 0; i <= m; i++)
putchar(list[i]);
putchar('\n');
total++;
}
else // list[k:m ]有多个排列方式
// 递归地产生这些排列方式
for (i=k; i <= m; i++) {
if((list[i] != list[k] && !isTrack(list,k,i)) || i==k){
Swap (&list[k], &list[i]);
Perm (list, k+1, m);
Swap (&list [k], &list [i]);
}
}
}