请高手指教

lwbhero 2002-08-31 08:46:07
输入n个不同的字符并打印着n个字符的全部n!个排列

请各位高手给个算法(最好不要用第归)。

谢谢了!
...全文
22 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
hequhecong 2002-09-01
  • 打赏
  • 举报
回复
Cybergate(Cybergate)
换汤不换药
真没劲
ddcat 2002-08-31
  • 打赏
  • 举报
回复
一般来说递归效率比较低。
可以用堆栈的方法模拟递归的过程,这样的效率应该是比较高的了。
lwbhero 2002-08-31
  • 打赏
  • 举报
回复

如果用pascal来实现呢?


请阐述一下算法,不用写源代码。


多谢了!
Wugifer 2002-08-31
  • 打赏
  • 举报
回复
#include <algorithm>

void main()
{
char array[] = "abcd"; //a、b、c、d是需要排序的字符
printf( "%s\n", array );
while( std ::next_permutation( array, array + strlen( array ) ) )
printf( "%s\n", array );
}

有现成的算法为什么不用呢?
Cybergate 2002-08-31
  • 打赏
  • 举报
回复
这个程序没有采用通常的回溯法,而运用了排列组合的知识

例如,我们把abc进行全排列,并对它们编号:
abc 0
acb 1
bac 2
bca 3
cab 4
cba 5

因此,只要设计一个算法,把编号转变成为相应的字符串就可以了。具体请看程序

#include <iostream.h>
#include <string.h>

void main()
{
const int size=10;
char s[size], b[size];
long f[size+1], i, j;
int l, k, m, n;
cout << "Enter string: "; cin >> s;
l=strlen(s);
for (f[0]=1, k=1; k<=l; k++) f[k]=f[k-1]*k; //计算阶乘
for (i=0; i<f[l]; i++) { // i 为编号
j=i;
strcpy(b,s);
for (k=l-1; k>=0; k--) {
cout << b[n=j/f[k]];
j-=n*f[k];
strcpy(b+n, b+n+1);
}
cout << endl;
}
}

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧