| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 768 人关注过本帖
标题:请教一下卧龙先生,
只看楼主 加入收藏
bupthehe
Rank: 1
等 级:新手上路
帖 子:61
专家分:0
注 册:2007-8-2
收藏
 问题点数:0 回复次数:8 
请教一下卧龙先生,
用插孔法来找数字的全排列,该用什么算法来实现呢?

举个例子,已经知道123的全排列是 123 132 213 231 312 321
想求1234的全排列,对123来讲,它有四个空隙可以插入数字4,出来的结果是4123 1423 1243 1234
同样对132 213 。。。。。321做相同的处理, 就可以得到N=4时的全排列了


只是这个算法该怎么写呢?
想用个递归调用,可是感到是老虎吃天,无从下爪啊!
搜索更多相关主题的帖子: 卧龙 老虎 数字 算法 
2007-08-03 08:51
totohack
Rank: 1
等 级:新手上路
帖 子:133
专家分:0
注 册:2007-7-15
收藏
得分:0 
在网上搜索一下,应该有这方面的资料

论坛上也有关于全排列的问题
[URL=http://bbs.bc-cn.net/viewthread.php?tid=90424&star=at#]http://bbs.bc-cn.net/viewthread.php?tid=90424&star=at#[/URL]

2007-08-03 09:04
bupthehe
Rank: 1
等 级:新手上路
帖 子:61
专家分:0
注 册:2007-8-2
收藏
得分:0 
以下是引用bupthehe在2007-8-3 8:51:40的发言:
用插孔法来找数字的全排列,该用什么算法来实现呢?

举个例子,已经知道123的全排列是 123 132 213 231 312 321
想求1234的全排列,对123来讲,它有四个空隙可以插入数字4,出来的结果是4123 1423 1243 1234
同样对132 213 。。。。。321做相同的处理, 就可以得到N=4时的全排列了


只是这个算法该怎么写呢?
想用个递归调用,可是感到是老虎吃天,无从下爪啊!

多谢

2007-08-03 09:06
卧龙孔明
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:59
帖 子:3872
专家分:684
注 册:2006-10-13
收藏
得分:0 
#include<stdio.h>
char s[6][20]={{1,2,3},{1,3,2},{2,1,3},{2,3,1},{3,1,2},{3,2,1}};
int q(int d,int now,int x)
{
int i,k;
if(d<now) { for(i=0;i<d;i++) printf("%d ",s[x][i]); putchar('\n'); return 0; }
for(i=0;i<now;i++)
{
for(k=now-1;k>i;k--) s[x][k]=s[x][k-1];
s[x][i]=now;
q(d,now+1,x);
for(k=i;k<now;k++) s[x][k]=s[x][k+1];
}
}
int main(void)
{
int n;
int i;
scanf("%d",&n);
for(i=0;i<6;i++) q(n,4,i);
return 0;
}

刚才写的,未完全测试,你试一下

My Blog: www.aiexp.info
虽然我的路是从这里开始的,但是这里不再是乐土.感谢曾经影响过,引导过,帮助过我的董凯,飞燕,leeco,starwing,Rockcarry,soft_wind等等等等.别了,BCCN.
2007-08-03 09:28
卧龙孔明
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:59
帖 子:3872
专家分:684
注 册:2006-10-13
收藏
得分:0 
在DEV-CPP下编译通过(TC下也应该可以通过)

My Blog: www.aiexp.info
虽然我的路是从这里开始的,但是这里不再是乐土.感谢曾经影响过,引导过,帮助过我的董凯,飞燕,leeco,starwing,Rockcarry,soft_wind等等等等.别了,BCCN.
2007-08-03 09:29
bupthehe
Rank: 1
等 级:新手上路
帖 子:61
专家分:0
注 册:2007-8-2
收藏
得分:0 
回复:(bupthehe)以下是引用bupthehe在2007-8-3 8:5...
辛苦了,谢谢卧龙了

我比较不清楚的地方就是这个函数的调用,刚才我是给你举个例子,就是说已知3的全排列,求4的全排列

我想做的是,求N的全排列。方法是用N来递归调用(N-1)的全排列,N-1调用N-2。。。,一直到N=2,全排列为12 21;


问题就出现在,这里面N 与N-1都是一个变量,如果用数组来实现的话,而数组的长度必须是定直的,不能随着变量的更改而更改

伪代码如下:
num(N)
{if N==2 生成一个2维数组,里面是 1 2 2 1};
N>=2 则调用num(N-1) 根据num(N-1) 来构造出num(N)这个数组}


实际实现的时候,就是这个数组的长度是不确定的,而用链表则插入起来太麻烦了

}
2007-08-03 09:45
卧龙孔明
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:59
帖 子:3872
专家分:684
注 册:2006-10-13
收藏
得分:0 
不要认为函数调用中写了个4就是算4的排列,那是个初始值,可以通过输入n(代码中的scanf)来求,由于我写的char s[6][20],所以最大可以求出20的全排列
可以将char s[6][X]中的X设的很大,代码中辅助存储空间也很小,所以X甚至可以到好几万(前提是将char改为int)


My Blog: www.aiexp.info
虽然我的路是从这里开始的,但是这里不再是乐土.感谢曾经影响过,引导过,帮助过我的董凯,飞燕,leeco,starwing,Rockcarry,soft_wind等等等等.别了,BCCN.
2007-08-03 09:53
卧龙孔明
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:59
帖 子:3872
专家分:684
注 册:2006-10-13
收藏
得分:0 
具体数组的变长可以参照以前的精华帖,用链表麻烦,如果要存储这些排列可以先建一个足够大的数组,然后将算出的值存入

My Blog: www.aiexp.info
虽然我的路是从这里开始的,但是这里不再是乐土.感谢曾经影响过,引导过,帮助过我的董凯,飞燕,leeco,starwing,Rockcarry,soft_wind等等等等.别了,BCCN.
2007-08-03 09:55
bupthehe
Rank: 1
等 级:新手上路
帖 子:61
专家分:0
注 册:2007-8-2
收藏
得分:0 
哦,多谢
2007-08-03 10:24
快速回复:请教一下卧龙先生,
数据加载中...
 
   



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

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