怎么离开冥狱深渊:一个算法的问题(希望有高手用C解答)

来源:百度文库 编辑:高考问答 时间:2024/05/06 05:04:14
问题具体如下:

给出具体的一个有序数列数(可要0也可不要0 这个不是关键) 要求能打印这N个数的所有排列情况

例如 给出的数为 1,2,3

则希望能打印出为:

1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1

以上是结果

可以证明 当可能出现的情况是N!(上例为 3!=6)

希望有高手可以用C/C++解答 谢谢

小弟我也不是偷懒不想动脑筋

本来是想用递归的想法来解决

但是想到最后 怎么都写不出.....

学艺不精....不好意思

#include<stdio.h>
#include<string.h>

int q(char ch)
{
if('A'<=ch&&ch<='Z') return 2*(ch-65);
else if('a'<=ch&&ch<='z') return 2*(ch-97)+1;
}

void swap(char *a, int k, int m)
{
char tmp;
int i;
if(k==m||a[k]==a[m]) return ;
tmp=a[m];
for(i=m-1; i>=k; i--) a[i+1]=a[i];
a[k]=tmp;
return ;
}

void restore(char *a, int k, int m)
{
char tmp;
int i;
if(k==m||a[k]==a[m]) return;
tmp=a[k];
for(i=k+1; i<=m; i++) a[i-1]=a[i];
a[m]=tmp;
return ;
}

void sort(char *a, int m, int n)
{
int i, j;
for(i=m; i<=n; i++)
for(j=i; j<=n; j++)
if(q(a[j])<q(a[i])) swap(a, i, j);
return;
}

void perm(char *a, int k, int m)
{
int i;
char abv;

if(k==m) {
for(i=0; i<=m; i++)
printf("%c", a[i]);
printf("\n");
}
else for(i=k, abv=a[k]; i<=m; i++) {
if(i==k||a[i]!=abv) {
swap(a, k, i);
perm(a, k+1, m);
restore(a, k, i);
abv=a[i];
}
}
return ;
}

int main()
{
char str[15];
int i, j, k, len;
gets(str);
len=strlen(str);
sort(str, 0, len-1);
perm(str, 0, len-1);
return 0;
}

不好意思,小弟不是不告诉你,我也不知道啊