一个简单的问题?

giantzz 2002-03-18 05:57:53
如何用递归实现n个元素所有的排列方式并打印出来?
...全文
5 点赞 收藏 9
写回复
9 条回复
fangrk 2002年03月20日
http://www.csdn.net/Expert/TopicView1.asp?id=562179
回复 点赞
ygd 2002年03月20日
#include <iostream.h>





#include <conio.h>





#define size 50





//////////////////////////////////////////





int array[size][size]; //全局变量,array用来表示所求矩阵.





int num=0; //所有拉丁方矩阵的个数





int flag=1; //打印标志位,为1则打印。





void swap(int &a,int &b); //交换a,b





void setArray(int n); //初始化二维数组





void perm(int *arr,int k,int m); //对数组arr,从下标k到m的元素全排列





//////////////////////////////////////////////





void swap(int &a,int &b)



{





int temp=a;a=b;b=temp;





}





//////////////////////////////////////////////





void perm(int *arr,int k,int n)



{





if(k>=n)





{







num++;







if(flag==1)







{







cout<<"press y to print , press n to continue."<<endl;





cout<<endl;







if (getch()=='n') flag=0;







}







if(flag==1)







{







cout<<"-----------------------------------------\n";







cout<<num<<endl;







for(int i=0;i<n;i++)







{







for(int j=0;j<n;j++)







cout<<array[arr[i]-1][j]<<" ";







cout<<endl;







}



}



}



else for(int i=k;i<n;i++)







{







swap(arr[k],arr[i]);







perm(arr,k+1,n);







swap(arr[k],arr[i]);







}





}





////////////////////////////////////////////////





void setArray(int n)



{





int i,j;





for(i=0;i<n;i++)





{







array[0][i]=i+1;







}





for(i=1;i<n;i++)





{





for(j=0;j<n-1;j++)





array[i][j]=array[i-1][j+1];





array[i][n-1]=array[i][0]-1;





}





}





////////////////////////////////////////////////





void main()





{





int i,j,k;





//int array[size][size]





int arr[size];





cout<<"Input the size of array:";





int n;





cin>>n;





for(i=0;i<n;i++)





{





arr[i]=i+1;





}





setArray(n);





perm(arr,0,n);





cout<<"The total number of the array is "<<num<<endl;





getch();





}

回复 点赞
iamknight 2002年03月20日
就是,用递归解决,对效率就不可能有太高的要求了。
回复 点赞
giantzz 2002年03月20日
帮忙用c描述一下!!!
回复 点赞
giantzz 2002年03月19日
dd
回复 点赞
neccui 2002年03月18日
否则什么?

这个问题不可能高效的了。
回复 点赞
giantzz 2002年03月18日
请用C语言描述,要高效(否则...)
回复 点赞
Cauty45 2002年03月18日
void f(int a[], int flag[],int n)
{
if(n==1){
out a[i] where flag[i]==1;
return;
}
for(每一个flag[i]==1 的i){
copy flag[]==>flag1[];
flag1[i]=0;
f(a,flag1,n-1);
}
}

void main()
{
int a[]={1,2,3,4,5};
int flag[]={1,1,1,1,1};
f(a,flag,5);



}
回复 点赞
Cauty45 2002年03月18日
void f(int a[], int flag[],int n)
{
if(n==1){
out a[i] where flag[i]==1;
}
for(每一个flag[i]==1 的i){
copy flag[]==>flag1[];
flag1[i]=0;
f(a,flag1,n-1);
}
}
回复 点赞
发动态
发帖子
C语言
创建于2007-09-28

3.2w+

社区成员

24.0w+

社区内容

C语言相关问题讨论
社区公告
暂无公告