一个简单的问题?

giantzz 2002-03-18 05:57:53
如何用递归实现n个元素所有的排列方式并打印出来?
...全文
46 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
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);
}
}

70,021

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧