当前位置: 代码迷 >> C语言 >> 请教一下卧龙先生,
  详细解决方案

请教一下卧龙先生,

热度:241   发布时间:2007-08-03 08:51:40.0
请教一下卧龙先生,
用插孔法来找数字的全排列,该用什么算法来实现呢?

举个例子,已经知道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时的全排列了


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

多谢


----------------解决方案--------------------------------------------------------
#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)


----------------解决方案--------------------------------------------------------
具体数组的变长可以参照以前的精华帖,用链表麻烦,如果要存储这些排列可以先建一个足够大的数组,然后将算出的值存入
----------------解决方案--------------------------------------------------------
哦,多谢
----------------解决方案--------------------------------------------------------
  相关解决方案