算法问题

输入任意个数的不同字母,要求将这些字母的所有排列组合都列举出来例如:如果输入A,B,C输出结果为:AABACABCACBBBABCBACBCACCACBCABCBA谢谢了... 输入任意个数的不同字母,要求将这些字母的所有排列组合都列举出来
例如:
如果输入 A,B,C
输出结果为:
A
AB
AC
ABC
ACB
B
BA
BC
BAC
BCA
C
CA
CB
CAB
CBA

谢谢了!
在C++版,当然是写程序了,这个还需要说,用代码写出来

不会写代码的给个思想,能解决问题照样给分

不麻烦怎么会是100分,麻烦各位给我点实质性的回复,谢谢
谢谢9楼的兄弟,调试后发现里面有好多重复结果,我需要无重复的……
谢谢10楼的兄弟对我的回复,但是你这个只能限制在3个字母上全排列,能否修改成递归的,因为我需要的是任意个数的字母都可以用。谢谢
太感谢10楼的大哥了,你的代码我试过,就是我要的效果,可惜是VC的,我用的是BCB,VC不是很熟,我先试着转的看看,你要是能帮我转BCB那就更好了。十分感谢!
展开
 我来答
wangyu0831
2008-02-19 · TA获得超过540个赞
知道小有建树答主
回答量:243
采纳率:0%
帮助的人:399万
展开全部
#include <stdio.h>
#include <string.h>

/*
可以用有限状态机来解这个题。
设一个起始点S,一个终点T,三个中间点A,B,C
以其中一点来分析:
从S状态能够到达的状态就为A,B,C
而从A状态能够到达的状态则为B,C,T
从B状态能够到达的状态则为A,C,T
从C状态能够到达的状态则为A,B,T
当然,还要考虑不能“走回头路”,即ABA这样的是不允许的。
*/

void S(int a, int b, int c, const char* s);
void A(int b, int c, const char* s);
void B(int a, int c, const char* s);
void C(int a, int b, const char* s);
void T(const char* s);

void S(int a, int b, int c, const char* s)
{
A(b, c, s);
B(a, c, s);
C(a, b, s);
}

void A(int b, int c, const char* s)
{
char t[4];
//1
strcpy(t, s);
strcat(t, "A");
T(t);

//2
if (!b)
{
strcpy(t, s);
strcat(t, "A");
B(1, c, t);
}

//3
if (!c)
{
strcpy(t, s);
strcat(t, "A");
C(1, b, t);
}
}

void B(int a, int c, const char* s)
{
char t[4];
//1
strcpy(t, s);
strcat(t, "B");
T(t);

//2
if (!a)
{
strcpy(t, s);
strcat(t, "B");
A(1, c, t);
}

//3
if (!c)
{
strcpy(t, s);
strcat(t, "B");
C(a, 1, t);
}
}

void C(int a, int b, const char* s)
{
char t[4];
//1
strcpy(t, s);
strcat(t, "C");
T(t);

//2
if (!a)
{
strcpy(t, s);
strcat(t, "C");
A(b, 1, t);
}

//3
if (!b)
{
strcpy(t, s);
strcat(t, "C");
B(a, 1, t);
}
}

void T(const char* s)
{
printf("%s\n", s);
}

int main()
{
char s[4] = "";
S(0, 0, 0, s);
return 0;
}
杀破狼O636H
2008-02-19 · TA获得超过201个赞
知道答主
回答量:89
采纳率:0%
帮助的人:52.7万
展开全部
这个简单,先设置1=A,2=B,3=C。然后进入循环,第一个循环是输出1,12,13,123,132 那么也就是先输出1在输出比1大的数2(1+1),回车,在输出3(1+1+1),然后跳出循环,如此便可。 我是大一时候学的,现在大三了,已经忘得差不多,要不还真能帮你写一下。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
斯霞公良雨星
2019-02-04 · TA获得超过3546个赞
知道小有建树答主
回答量:2953
采纳率:30%
帮助的人:369万
展开全部
优选法

优选法是华罗庚运用黄金分割法发明的一种可以尽可能减少做试验次数、尽快地找到最优方案的方法。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2008-02-19
展开全部
#include <iostream>

using namespace std;

void Full(char * base, int basesize, int count)
{

int *visit = new int[count];
int i;
for(i=0;i<count;i++)
visit[i]=0;
while(1)
{
for(i=0;i<count;i++)
printf("%c ",base[visit[i]]);
printf("\n");

for(i=count-1;i>=0;i--)
{
if(visit[i]==basesize-1)
visit[i]=0;
else
break;
}
if(i<0)
break;//Finished
visit[i]++;
}
delete [] visit;
}

int main(int argc, char* argv[])
{
char a[]={'A','B','C'}; /*改为输入也可以*/
int n = sizeof(a)/sizeof(a[0]);
for(int i = 0;i <= n;i++)
Full(a, n, i);
system("pause");
return 0;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
hellson
2008-02-19 · TA获得超过2949个赞
知道大有可为答主
回答量:2952
采纳率:0%
帮助的人:1894万
展开全部
求全排列的问题,csdn上的帖子如下:
http://topic.csdn.net/t/20030529/06/1848105.html
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(11)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式