[编程竞赛]****第四题****
给定一个整数n(1<=n<10),及一个m(1<=m<=n),
求1——n之间所有m个数的不同排列组合
例如:n=4,m=2
输出:
1 2 1 3 1 4 2 1 2 3 2 4 3 1 3 2 3 4 4 1 4 2 4 3
编程实现,可以用递归或非递归
main()
{int i,,j,t=1,m,n;
while(t==1)
{printf("input 2 numbers(n,m):");
scanf("%d%d",&n,&m);
if(n>=1&&n<10&&m>=1&&m<=n) t=0;
else {printf("input erroe!\n"); t=1;}
}
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(i!=j) printf("%d\t%d\n",i,j);
}
我想的方法太笨,要用一个switch(m),程序太长,不想写,有没有好办法啊?
[此贴子已经被作者于2004-06-19 20:02:13编辑过]
main()
{int i,j,t=1,m,n,k[11];
while(t==1)
{printf("input 2 numbers(n,m):");
scanf("%d%d",&n,&m);
if(n>=1&&n<10&&m>=1&&m<=n) t=0;
else {printf("input erroe!\n"); t=1;}
} for(k[1]=1;k[1]<=n;k[1]++)
if(m==1) {for(i=1;i<=m;i++) printf("%d ",k[i]]); printf("\n");}
else for(k[2]=1;k[2]<=m;k[2]++)
if(k[1]!=k[2]) { if(m==2) {for(i=1;i<=m;i++) printf("%d ",k[i]]); printf("\n");}
else for(k[3]=1;k[3]<=m;k[3]++)
if(k[3]!=k[1]&&k[3]!=k[2]) {if(m==3) {for(i=1;i<=m;i++) printf("%d ",k[i]]); printf("\n");}
else for(k[4]=1;k[4]<=m;k[4]++)
if(k[4]!=k[1]&&k[4]!=k[2]&&k[4}!=k[3]) {if(m==4) {for(i=1;i<=m;i++) printf("%d ",k[i]]); printf("\n");}
else for(k[5]=1;k[5]<=n;k[5]++)
if(k[5]!=k[1]&&k[5]!=k[2]&&k[5]!=k[3]&&k[5]!=k[4]) { if(m==5) {for(i=1;i<=m;i++) printf("%d ",k[i]]); printf("\n");}
else for(k[6]=1;k[6]<=n;k[6]++)
if(k[6]!=k[1]&&k[6]!=k[2]&&k[6]!=k[3]&&k[6]!=k[4]&&k[6]!=k[5])
{if(m==6) {for(i=1;i<=m;i++) printf("%d ",k[i]]); printf("\n");}
else for(k[7]=1;k[7]<=m;k[7]++)
if(k[7]!=k[1]&&k[7]!=k[2]&&k[7]!=k[3]&&k[7]!=k[4]&&k[7]!=k[5]&&k[7]!=k[6])
{ if(m==7) {for(i=1;i<=m;i++) printf("%d ",k[i]]); printf("\n");}
else for(k[8]=1;k[8]<=n;k[8]++)
if(k[8]!=k[1]&&k[8]!=k[2]&&k[8]!=k[3]&&k[8]!=k[4]&&k[8]!=k[5]&&k[8]!=k[6]&&k[8]!=k[7])
{ if(m==8) {for(i=1;i<=m;i++) printf("%d ",k[i]]); printf("\n");}
else for(k[9]=1;k[9]<=n;k[9]++)
if(k[9]!=k[1]&&k[9]!=k[2]&&k[9]!=k[3]&&k[9]!=k[4]&&k[9]!=k[5]&&k[9]!=k[6]&&k[9]!=k[7]&&k[9]!=k[8]) {
if(m==9) {for(i=1;i<=m;i++) printf("%d ",k[i]]); printf("\n");}
else for(k[10]=1;k[10]<=n;k[10]++)
if(k[10]!=k[1]&&k[10]!=k[2]&&k[10]!=k[3]&&k[10]!=k[4]&&k[10]!=k[5]&&k[10]!=k[6]&&
k[10]!=k[7]&&k[10]!=k[8]&&k[10]!=k[9])
{for(i=1;i<=m;i++) printf("%d ",k[i]]); printf("\n");} }}}}}}}}}
这样写不知道对不对,括号有可能多写或少写了,如有错误,望指出,谢谢!
呵呵,菜鸟凑个热闹
#include<iostream.h> void swap(int [],int,int); void permute(int[],int,int,int);
#define Max 10 int main() { int m,n; int data[Max]={1,2,3,4,5,6,7,8,9,10}; tt: cin>>m>>n; if(m>10||n>10||m<n) goto tt; permute(data,0,n,m); return 0; }
void swap(int data[], int x, int y) { int a=data[x]; data[x]=data[y]; data[y]=a; }
void permute(int data[], int s,int n,int m) { if(s==n) { for(int i=0;i<n;i++) cout<<data[i]; cout<<endl; } else {
for(int j=s; j<m; j++) { swap(data,j,s); permute(data,s+1,n,m); swap(data,s,j); } } }
我是用递归,好处就是运行时间比较短
[此贴子已经被作者于2004-06-20 21:37:32编辑过]
main()
{int i,j,t=1,m,n,k[11];
while(t==1)
{printf("input 2 numbers(n,m):");
scanf("%d%d",&n,&m);
if(n>=1&&n<10&&m>=1&&m<=n) t=0;
else {printf("input erroe!\n"); t=1;}
} for(k[1]=1;k[1]<=n;k[1]++)
if(m==1) {for(i=1;i<=m;i++) printf("%d ",k[i]); printf("\n");}
else for(k[2]=1;k[2]<=m;k[2]++)
if(k[1]!=k[2]) { if(m==2) {for(i=1;i<=m;i++) printf("%d ",k[i]); printf("\n");}
else for(k[3]=1;k[3]<=m;k[3]++)
if(k[3]!=k[1]&&k[3]!=k[2]) {if(m==3) {for(i=1;i<=m;i++) printf("%d ",k[i]); printf("\n");}
else for(k[4]=1;k[4]<=m;k[4]++)
if(k[4]!=k[1]&&k[4]!=k[2]&&k[4]!=k[3]) {if(m==4) {for(i=1;i<=m;i++) printf("%d ",k[i]); printf("\n");}
else for(k[5]=1;k[5]<=n;k[5]++)
if(k[5]!=k[1]&&k[5]!=k[2]&&k[5]!=k[3]&&k[5]!=k[4]) { if(m==5) {for(i=1;i<=m;i++) printf("%d ",k[i]); printf("\n");}
else for(k[6]=1;k[6]<=n;k[6]++)
if(k[6]!=k[1]&&k[6]!=k[2]&&k[6]!=k[3]&&k[6]!=k[4]&&k[6]!=k[5])
{if(m==6) {for(i=1;i<=m;i++) printf("%d ",k[i]); printf("\n");}
else for(k[7]=1;k[7]<=m;k[7]++)
if(k[7]!=k[1]&&k[7]!=k[2]&&k[7]!=k[3]&&k[7]!=k[4]&&k[7]!=k[5]&&k[7]!=k[6])
{ if(m==7) {for(i=1;i<=m;i++) printf("%d ",k[i]); printf("\n");}
else for(k[8]=1;k[8]<=n;k[8]++)
if(k[8]!=k[1]&&k[8]!=k[2]&&k[8]!=k[3]&&k[8]!=k[4]&&k[8]!=k[5]&&k[8]!=k[6]&&k[8]!=k[7])
{ if(m==8) {for(i=1;i<=m;i++) printf("%d ",k[i]); printf("\n");}
else for(k[9]=1;k[9]<=n;k[9]++)
if(k[9]!=k[1]&&k[9]!=k[2]&&k[9]!=k[3]&&k[9]!=k[4]&&k[9]!=k[5]&&k[9]!=k[6]&&k[9]!=k[7]&&k[9]!=k[8]) {
if(m==9) {for(i=1;i<=m;i++) printf("%d ",k[i]); printf("\n");}
else for(k[10]=1;k[10]<=n;k[10]++)
if(k[10]!=k[1]&&k[10]!=k[2]&&k[10]!=k[3]&&k[10]!=k[4]&&k[10]!=k[5]&&k[10]!=k[6]&&
k[10]!=k[7]&&k[10]!=k[8]&&k[10]!=k[9])
{for(i=1;i<=m;i++) printf("%d ",k[i]); printf("\n");} }}}}}}}}}
经过修改,通过调试,可以运行出来。
方法太笨,源码太多,有没有简单点的,能看懂的啊,上面那位大哥写的我看不懂!