请教一下卧龙先生,
用插孔法来找数字的全排列,该用什么算法来实现呢?举个例子,已经知道123的全排列是 123 132 213 231 312 321
想求1234的全排列,对123来讲,它有四个空隙可以插入数字4,出来的结果是4123 1423 1243 1234
同样对132 213 。。。。。321做相同的处理, 就可以得到N=4时的全排列了
只是这个算法该怎么写呢?
想用个递归调用,可是感到是老虎吃天,无从下爪啊!
----------------解决方案--------------------------------------------------------
在网上搜索一下,应该有这方面的资料
论坛上也有关于全排列的问题
[URL=http://bbs.bc-cn.net/viewthread.php?tid=90424&star=at#]http://bbs.bc-cn.net/viewthread.php?tid=90424&star=at#[/URL]
----------------解决方案--------------------------------------------------------
以下是引用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时的全排列了
只是这个算法该怎么写呢?
想用个递归调用,可是感到是老虎吃天,无从下爪啊!
用插孔法来找数字的全排列,该用什么算法来实现呢?
举个例子,已经知道123的全排列是 123 132 213 231 312 321
想求1234的全排列,对123来讲,它有四个空隙可以插入数字4,出来的结果是4123 1423 1243 1234
同样对132 213 。。。。。321做相同的处理, 就可以得到N=4时的全排列了
只是这个算法该怎么写呢?
想用个递归调用,可是感到是老虎吃天,无从下爪啊!
多谢
----------------解决方案--------------------------------------------------------
#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;
}
刚才写的,未完全测试,你试一下
----------------解决方案--------------------------------------------------------
在DEV-CPP下编译通过(TC下也应该可以通过)
----------------解决方案--------------------------------------------------------
回复:(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)这个数组}
实际实现的时候,就是这个数组的长度是不确定的,而用链表则插入起来太麻烦了
}
----------------解决方案--------------------------------------------------------
不要认为函数调用中写了个4就是算4的排列,那是个初始值,可以通过输入n(代码中的scanf)来求,由于我写的char s[6][20],所以最大可以求出20的全排列
可以将char s[6][X]中的X设的很大,代码中辅助存储空间也很小,所以X甚至可以到好几万(前提是将char改为int)
----------------解决方案--------------------------------------------------------
具体数组的变长可以参照以前的精华帖,用链表麻烦,如果要存储这些排列可以先建一个足够大的数组,然后将算出的值存入
----------------解决方案--------------------------------------------------------
哦,多谢
----------------解决方案--------------------------------------------------------