当前位置: 代码迷 >> C语言 >> [求助]nuciewth 版主,请教你写的程序
  详细解决方案

[求助]nuciewth 版主,请教你写的程序

热度:343   发布时间:2006-09-12 19:06:02.0
[求助]nuciewth 版主,请教你写的程序


这是你写的,1到5全排列的代码,有点不明白这是怎么循环的,请教一下,呵呵

(因为在那个贴里回贴,你也不回,所有又发了个新贴)

#include<stdio.h>
#define N 5
int cont=1 ;
void test(int str[],int n)
{
int i,j,m,b[N];
for(i=0;i<n;i++)
{
m=0 ;
for(j=i;j<n;j++)
{
if(str[i]>str[j])
{
b[m++]=str[j];
}
}
}

i=0 ;
printf(" 第%2d种情况:",cont++); //根据主函数,这就应该是最后输出的结果了,怎么会循环那么多次
for(i=0;i<n;i++)            //呢?    
  {
printf("%d",str[i]);
}
printf("\n");

}
void perm(int str[],int k,int n)
{
int i,temp;

if(k==n-1)
{
test(str,n);            //如果这句这出口,就应该出一次吧,
}
else
{
for(i=k;i<n;i++)
{
temp=str[k];
str[k]=str[i];
str[i]=temp ;
perm(str,k+1,n); //这句递归,有什么作用?
temp=str[i];           //这三句,能运行到吗?
str[i]=str[k];
str[k]=temp ;
}
}
}

int main()
{
int str[N],i ;

for(i=0;i<N;i++)str[i]=i+1 ;
printf("各种情况:\n");
perm(str,0,N);
printf("\n");
return(0);
}

搜索更多相关的解决方案: nuciewth  版主  

----------------解决方案--------------------------------------------------------
不好意思,因为我最近在整理排列问题的算法,我想一有时间我就会完整的写出来的.
目前有递归的,我再想出非递归的就会发出来的,我想尽量在这个星期之前吧.

我在这里简单的说一下:
设R={r1,r2,..rn} 是要进行排列的n个元素,Ri=R-{ri}.集合X中元素的全排列记为perm(X);
设(ri)perm(X)表示每一个全排列前加上前缀ri得到的排列.

当n=1时,perm(R)=(r) 其中r是唯一的元素
当n>1时,perm(R)由(r1)perm(R1),(r2)perm(R2),...(rn)perm(Rn)构成.

----------------解决方案--------------------------------------------------------