zoukankan      html  css  js  c++  java
  • 蓝桥杯 抽签

    蓝桥杯 抽签

    【题目描述 - Problem Description】

    X星球要派出一个5人组成的观察团前往W星。 其中: A国最多可以派出4人。 B国最多可以派出2人。 C国最多可以派出2人。 ....

    那么最终派往W星的观察团会有多少种国别的不同组合呢?

    下面的程序解决了这个问题。 数组a[] 中既是每个国家可以派出的最多的名额。 程序执行结果为:

    DEFFF
    CEFFF
    CDFFF
    CDEFF
    CCFFF
    CCEFF
    CCDFF
    CCDEF
    BEFFF
    BDFFF
    BDEFF
    BCFFF
    BCEFF
    BCDFF
    BCDEF
    ....
    (以下省略,总共101行)
    
     1 #include <stdio.h>
     2 #define N 6
     3 #define M 5
     4 #define BUF 1024
     5 
     6 void f(int a[], int k, int m, char b[])
     7 {
     8     int i,j;
     9     
    10     if(k==N){ 
    11         b[M] = 0;
    12         if(m==0) printf("%s
    ",b);
    13         return;
    14     }
    15     
    16     for(i=0; i<=a[k]; i++){
    17         for(j=0; j<i; j++) b[M-m+j] = k+'A';
    18         _____________;  //填空位置
    19     }
    20 }
    21 int main()
    22 {    
    23     int  a[N] = {4,2,2,1,1,3};
    24     char b[BUF];
    25     f(a,0,M,b);
    26     return 0;
    27 }
    填空代码

    【题解】
    一看到这道题就想起了自己在懒得写for的时候就用DFS代替……

    因为里面的两层循环只能为6个数枚举一个,再加上上面的条件输出,f(a, ?, ?, b);基本是钦定的形式。

    k == N 推测,k记录当前层数。

    b[M - m + j] = k + 'A';和f(a, 0, M, b); 推测m为当前未使用的层数。

     

    【最终结果】

    f(a, k + 1, m - i, b)

    f(a, k + 1, m - j, b)

    f(a, (++k)--, m - i, b)

    …………………………随便挑一个

    (某人:泥垢了!)

  • 相关阅读:
    「翻译」Unity中的AssetBundle详解(二)
    「翻译」Unity中的AssetBundle详解(一)
    [翻译]理解Unity的自动内存管理
    Unity3D集成腾讯语音GVoice SDK
    Unity插件之Unity调用C#编译的DLL
    最好用的Unity版本控制工具
    常见算法 php实现
    inotify+rsync实现文件双向实时同步
    30道Redis面试题
    mysql规范
  • 原文地址:https://www.cnblogs.com/Simon-X/p/6528734.html
Copyright © 2011-2022 走看看