北师大ACM新手指导第七题-枚举提高

来源:互联网 发布:python 打印数组 编辑:程序博客网 时间:2024/05/01 00:47
北师大ACM新手指导第七题-枚举提高Time Limit: 1000msMemory Limit: 65536KB64-bit integer IO format: %lld      Java class name: Main   如果你认为枚举只是一个很简单的算法那就大错特错了,上一题让大家求素数,所需要的枚举只是数轴上的线性枚举,但是,实际比赛中,枚举的维度很可能是二维的,枚举的方向也可能不是线性的。所以下面通过一道例题给大家介绍一种枚举的方法。考虑下面一个问题: 输入一个数N (0<N<8)和一个数K (0<k<=5),要求:从1~N这N个数字中,任意选出K个数字(数字可以重复选),请按大小输出所有的方案。 例如,输入: 3 2 则对应的输出应该为: 11 12 13 21 22 23 31 32 33 对于这道题,很明显,简单的FOR循环是不可能解决的。 请认真阅读以下的答案代码,如果可能,在IDE环境通过调试来查看整个程序运行过程,理解其中递归程序的调用过程。 如果一开始看不懂,请不要泄气,我也是看了一周才大概看懂的。 #include 〈stdio.h〉int n,k;int tt[9]; /*  tt[pt]表示第pt个数的取值  */void di(int pt){    int i;    if (pt>k) /* 如果前k个数的值都已确定,则输出 */    {    for (i=1; i<=k; ++i)         printf("%d",tt[i]);        printf("\n");            }        else     {                for (i=1; i<=n; ++i)        {               tt[pt] = i;              di(pt+1);          }          }       }      int main()   {           scanf("%d%d", &n, &k);       di(1);             return 0;     } Input两个数,N和KOutput按大小输出所有的方案。 每个方案一行。Sample Input3 2Sample Output111213212223313233Hint请看懂代码之后,自己写一遍,不要用我的代码。 以上代码也是经过处理,直接复制提交将不能通过。 只有自己写一遍才行。SourceTang Qiao @ BNU来源: https://www.bnuoj.com/bnuoj/problem_show.php?pid=4117
#include <cstdio>#include <cstring>char A[8];void Q_P(int N,int K,int Set){    if(K==Set) puts(A+1);//已经完成了排列 输出    else    {        for(int i=1;i<=N;i++)        {            A[Set+1] = '0'+i;            Q_P(N,K,Set+1);        }    }}int main(){   // freopen("D:\\test.txt","r",stdin);    int N,K;    while(~scanf("%d %d",&N,&K))    {        memset(A,0,sizeof(A));//这条非常重要 不论是第一次将数组其余原始置为'\0',还是其后清空数组        Q_P(N,K,0);    }    return 0;}
0 0