标题:[编程竞赛]****第四题****(全排列问题)
只看楼主
jzh2004
Rank: 1
等 级:新手上路
帖 子:341
专家分:0
注 册:2004-4-30
 问题点数:0 回复次数:11 
[编程竞赛]****第四题****(全排列问题)

[编程竞赛]****第四题****

给定一个整数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

编程实现,可以用递归或非递归

搜索更多相关主题的帖子: 排列 竞赛 递归 整数 给定 
2004-06-11 16:09
空前
Rank: 1
等 级:新手上路
帖 子:1146
专家分:0
注 册:2004-5-11
得分:0 

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编辑过]


2004-06-19 19:53
jzh2004
Rank: 1
等 级:新手上路
帖 子:341
专家分:0
注 册:2004-4-30
得分:0 

这个本来就是穷举法,办法自己慢慢想啊

做出来就有进步了


我的主页 http://www.
2004-06-19 21:33
空前
Rank: 1
等 级:新手上路
帖 子:1146
专家分:0
注 册:2004-5-11
得分:0 

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");} }}}}}}}}}

这样写不知道对不对,括号有可能多写或少写了,如有错误,望指出,谢谢!


2004-06-20 10:53
编程白痴
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2004-5-28
得分:0 

if(n>=1&&n<10&&m>=1&&m<=n)

t=0;

呵呵 大哥 请问上面这个语句中"&&"是指同时满足条件吗??

2004-06-20 12:42
当当
Rank: 1
等 级:新手上路
帖 子:235
专家分:0
注 册:2004-4-30
得分:0 
晕四楼的,不会吧,这么夸张

学好编程就能编出自己的未来! 加油!自信!努力!奋斗!
2004-06-20 21:07
zff_ff
Rank: 1
等 级:新手上路
帖 子:147
专家分:0
注 册:2004-5-12
得分:0 

呵呵,菜鸟凑个热闹

#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编辑过]


偶是一只想要飞却忘了咋飞的菜鸟
2004-06-20 21:29
空前
Rank: 1
等 级:新手上路
帖 子:1146
专家分:0
注 册:2004-5-11
得分:0 

回5楼的:不错,&&是同时满足,否则不会跳出循环,直到你输入满足条件的值时。

回6楼的:想不出更好的办法,只有这样啦,程序的运行时间主要取决于m的值,如果m==1,程序其实很短的,后面的不运行。你有没有更好的办法啊,写出来大家讨论讨论。

楼上的大哥,你用的好像是C++,定义函数时用void swap(int [],int,int) ,这个里面的[]是什么意思啊?还有我不知道“iostream.h”这是什么文件头,干什么用的。C++我基本上看不懂。


2004-06-21 10:19
zff_ff
Rank: 1
等 级:新手上路
帖 子:147
专家分:0
注 册:2004-5-12
得分:0 

晕,好象有人说过要用stdio.h。

呵呵,不好意思。

只要把程序里的cout和cin改成printf和scanf就可以了

void swap(int [],int,int)里的[]是指函数的形参是数组。


偶是一只想要飞却忘了咋飞的菜鸟
2004-06-21 11:45
空前
Rank: 1
等 级:新手上路
帖 子:1146
专家分:0
注 册:2004-5-11
得分:0 

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");} }}}}}}}}}

经过修改,通过调试,可以运行出来。

方法太笨,源码太多,有没有简单点的,能看懂的啊,上面那位大哥写的我看不懂! 


2004-06-21 16:13



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-2362-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.996800 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved