| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2180 人关注过本帖
标题:[求助]求排列组合
取消只看楼主 加入收藏
shensheng4
Rank: 1
等 级:新手上路
帖 子:80
专家分:0
注 册:2005-8-7
收藏
 问题点数:0 回复次数:5 
[求助]求排列组合

简单点说就是有 n 个字母,求这n个的所有排列情况
如果从中挑出m个字母,求所有的组合情况

搜索更多相关主题的帖子: 排列 
2006-06-28 21:36
shensheng4
Rank: 1
等 级:新手上路
帖 子:80
专家分:0
注 册:2005-8-7
收藏
得分:0 
先谢谢三楼的提示。
可能我没说清楚,这个题是要求任意个字符的排列组合问题。
我和另两个朋友讨论过,仍没有合适的解法。

三楼的朋友,
您的那个方法一个致命的思路错误就是使用了多重循环,
对于个数不确定n个字符,是不可能用多重循环实现的。

我看过八皇后问题。
八重循环的方法是最普通,且没价值的做法。
我看到过两个方法都是用回溯法作的,一个是递归回溯,一个是循环回溯。

这个题不适合用递归,我想用循环回溯。
只用一个雏形,没有完整的实现。

梦想是不可能实现的,正因为如此才值得我们去追寻。 这是我选择的路,即使付出一切,我也毫无怨言。
2006-06-29 09:11
shensheng4
Rank: 1
等 级:新手上路
帖 子:80
专家分:0
注 册:2005-8-7
收藏
得分:0 
顺便说一下。
我用C编程已有两年了,不能是很强,但可以说不是什么新手了。

就这个问题而言,是我最近想过的,纯粹是一时兴起,希望和大家探讨一下。
也许有人认为太简单。但是请高手能否拿出一个无可挑剔的程序。
供大家研究。

最起码我会感谢您的。也希望大家能不吝笔墨,留下一些思路想法,大家一起探讨。

如果我实现后,我会发出完整程序,到时还希望各位能多审核我的程序。

梦想是不可能实现的,正因为如此才值得我们去追寻。 这是我选择的路,即使付出一切,我也毫无怨言。
2006-06-29 09:16
shensheng4
Rank: 1
等 级:新手上路
帖 子:80
专家分:0
注 册:2005-8-7
收藏
得分:0 

美女说到就到啊
请高手指点一下这个题好吗


梦想是不可能实现的,正因为如此才值得我们去追寻。 这是我选择的路,即使付出一切,我也毫无怨言。
2006-06-29 09:25
shensheng4
Rank: 1
等 级:新手上路
帖 子:80
专家分:0
注 册:2005-8-7
收藏
得分:0 
呵呵..................
你俩很熟吗?
那顺便拉我一把,让这位高手露露本事。
好不?

梦想是不可能实现的,正因为如此才值得我们去追寻。 这是我选择的路,即使付出一切,我也毫无怨言。
2006-06-29 09:39
shensheng4
Rank: 1
等 级:新手上路
帖 子:80
专家分:0
注 册:2005-8-7
收藏
得分:0 
朋友,你这个取走归还的想法非常好啊。开眼界了。
我刚刚也写了一个,不是用递归,是先前我说的循环回溯。
请指点

int *para;
int count = 0;
int Local(int local, int length);
int checkEnd(int length);
void main()
{
int i, j, length;
char element[] ="abcdef";
length = 6;
para = (int *)malloc(sizeof(int) * length);
for(i = 0; i < length; i++)
para[i] = i;
while(1)
{
if(i == length) /* 输出结果 */
{
for(j = 0; j < length; j++)
printf("%2c", element[para[j]]);
printf("\n");
if((count++)%10 == 9)
{
printf("PRESS ANY KEY!\n");
getch();
}
if(checkEnd(length))
break;
i--;
}
else /*对第i位上的重新赋值*/
{
para[i] = Local(i, length); /*赋值*/
if(para[i] >= length) /*越界,向上回溯*/
{
for(j = i; j < length; j++)
para[j] = -1;
i--;
}
else /* 合法,继续 */
i++;
}
}
printf("__________END__________\n");
getch();
}
int Local(int local, int length)
{
int i, j;
for(i = (para[local] + 1); i < length; i++) /*此位上的值*/
{
for(j = 0; j < local; j++) /*与前面的值比较*/
if(para[j] == i)
break;
if(j >= local)
break;
}
return i;
}
int checkEnd(int length)
{
int i;
for(i = 0; i < length; i++)
if(para[i] != (length - 1 - i))
return 0;
return 1;
}

梦想是不可能实现的,正因为如此才值得我们去追寻。 这是我选择的路,即使付出一切,我也毫无怨言。
2006-06-29 12:16
快速回复:[求助]求排列组合
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.011437 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved