| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 829 人关注过本帖
标题:有个奥赛题,高手帮忙看一下
只看楼主 加入收藏
密码code
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2008-8-12
收藏
 问题点数:0 回复次数:5 
有个奥赛题,高手帮忙看一下
1.(全排列)下面程序的功能是利用递归方法生成从1到n(n<10)的n个数的全部可能的排列(不一
定按升序输出)。例如,输入3,则应该输出(每行输出5个排列):
123 132 213 231 321
312
程序:
#include<stdio.h>
int n,a[10]; /* a[1],a[2],…,a[n]构成n个数的一个排列 */
long count=0; /*变量count记录不同排列的个数,这里用于控制换行 */
void perm(int k)
{int j,p,t;
if( ① )
{count++;
for(p=1;p<=n;p++) printf("%1d",a[p]); /* "%1d"中是数字1,不是字母l */
printf(" ");
if( ② ) printf("\n");
return;

}
for(j=k;j<=n;j++)
{t=a[k];a[k]=a[j];a[j]=t;
③ ;
t=a[k]; ④ ;
}
}
main()
{int i;
printf("Entry n:\n"); scanf("%d",&n);
for(i=1;i<=n;i++) a[i]=i;
⑤ ;
}
答案1.① k==n (或n==k)
② count%5==0
③ perm(k+1)
④ a[k]=a[j];a[j]=t (分号可以用逗号代替)
⑤ perm(1)



完全不懂,那个perm函数前半部分好像是输出数组,但是后半部分我就弄不清楚他想干什么了
搜索更多相关主题的帖子: 奥赛 
2008-08-22 12:46
Fermat
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2008-8-22
收藏
得分:0 
回复 奥赛题
首先,原程序格式不太好,先整理一下:
#include<stdio.h>
int n,a[10];
/* a[1],a[2],…,a[n]构成n个数的一个排列 */
long count=0 ;
/*变量count记录不同排列的个数,这里用于控制换行 */
void perm(int k)
{
    int j,p,t ;
    if(k==n)
    {
        count++;
        for(p=1;p<=n;p++)printf("%1d",a[p]);
        /* "%1d"中是数字1,不是字母l */
        printf(" ");
        if(count%5==0)printf("\n");
        return ;
        
    }
    for(j=k;j<=n;j++)
    {
        t=a[k];
        a[k]=a[j];
        a[j]=t ;
        perm(k+1);
        t=a[k];
        a[k]=a[j];
        a[j]=t ;
    }
}
main()
{
    int i ;
    printf("Entry n:\n");
    scanf("%d",&n);
    for(i=1;i<=n;i++)a[i]=i ;
    perm(1);
}
perm()函数是一个递归函数。如果不知道递归函数是什么一定先去看一下教材之类的。
函数前半部分的确是输出数组,同时也是递归终止条件。k==n是终止这个递归的条件而函数后半部分的perm(k+1)则是增加k的使这个递归最终能完成。函数的后半部分是递归方式:每一个循环交换数组第一个数与数组中某一个数的值,然后把除第一个数以外的函数的后半部分递归,递归完再把第一个数与原来交换的那个数再换回原处。这人每一个循环交给后面的都是不同的情况,这样就能使每一种情况都没有重复,并且这样的递归方式也能使每一种情况都能包含进来。每个递归的结束前都打印结果,可以算一下,第一级的递归有n个循环,则下一级的递归有(n-1)乘以先前的n个,……,最后级的递归则有n*(n-1)*(n-2)…=n!个。由于只有末级的递归才具有k==n的条件,于是只有末端的循环才打印。
2008-08-22 16:31
密码code
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2008-8-12
收藏
得分:0 
t=a[k];
        a[k]=a[j];
        a[j]=t ;
这个什么意思?
2008-08-23 12:33
starway
Rank: 1
来 自:宜昌
等 级:新手上路
帖 子:3
专家分:0
注 册:2008-8-22
收藏
得分:0 
2008-08-23 14:09
yt22534827
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2008-8-17
收藏
得分:0 
呵呵,怎么像暴力破解密码的初级形式呀?
我晕咯!!呵呵!在改改的话这可以暴力破解密码了类!
2008-08-23 14:51
密码code
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2008-8-12
收藏
得分:0 
我就是不明白那个for(j=k;j<=n;j++)循环中调用了perm()函数怎么再循环下去,当k=2时,函数perm(k+1)不就直接输出了吗?怎么再执行t=a[k];a[k]=a[j];a[j]=t   这段语句?
2008-08-23 23:01
快速回复:有个奥赛题,高手帮忙看一下
数据加载中...
 
   



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

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