zoukankan      html  css  js  c++  java
  • 第七届蓝桥杯javaB组真题解析-抽签(第五题)

    题目

    /*
    抽签
    
    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行)
    
    
    public class A
    {
        public static void f(int[] a, int k, int n, String s)
        {
            if(k==a.length){ 
                if(n==0) System.out.println(s);
                return;
            }
            
            String s2 = s;
            for(int i=0; i<=a[k]; i++){
                _____________________________;   //填空位置
                s2 += (char)(k+'A');
            }
        }
        
        public static void main(String[] args)
        {
            int[] a = {4,2,2,1,1,3};
            
            f(a,0,5,"");
        }
    }
    
    
    仔细阅读代码,填写划线部分缺少的内容。
    
    注意:不要填写任何已有内容或说明性文字。
    */

    答案

    f(a,k+1,n-i,s2)

    代码

     1 public class Main {
     2     public static void f(int[] a, int k, int n, String s)
     3     {
     4         if(k==a.length){ 
     5             if(n==0) System.out.println(s);
     6             return;
     7         }
     8         
     9         String s2 = s;
    10         for(int i=0; i<=a[k]; i++){
    11             f(a,k+1,n-i,s2);  //填空位置
    12             s2 += (char)(k+'A');
    13         }
    14     }
    15     
    16     public static void main(String[] args)
    17     {
    18         int[] a = {4,2,2,1,1,3};
    19         
    20         f(a,0,5,"");
    21     }
    22 }

    分析

      这是一道很基础的循环递归题目,代码写的很精巧,但是也有没考虑到的地方,先说代码思路

     1     public static void f(int[] a, int k, int n, String s)
     2     {
     3         if(k==a.length){ 
     4             if(n==0) System.out.println(s);
     5             return;
     6         }
     7         
     8         String s2 = s;
     9         for(int i=0; i<=a[k]; i++){
    10             f(a,k+1,n-i,s2);  //填空位置
    11             s2 += (char)(k+'A');
    12         }
    13     }

      数组a是用来存储各个国家可以派遣的人数, 方法 f(int[] a, int k, int n, String s) 其中int[] a指代数组a,变量k 指代国家索引,变量n 指代当前已经选出的人数,变量s 指代 一个选出的用字符串表示的情况

      for循环,循环当前国家(a[k])的情况,并用s2存下来,然后k+1递归进入下一个国家(索引值),n-i 表示还需要派遣的人数,s2表示存储的当前情况。

      

    代码改进

      这个代码没有考虑当派遣的人数大于5的情况,这个情况时应该让代码跳出递归,改进的代码

     1 public class Main {
     2     public static void f(int[] a, int k, int n, String s)
     3     {
     4         if(k==a.length){ 
     5             if(n==0) System.out.println(s);
     6             return;
     7         }
     8         if(n<0)return;//改进的地方
     9         String s2 = s;
    10         for(int i=0; i<=a[k]; i++){
    11             f(a,k+1,n-i,s2);  //填空位置
    12 //            System.out.println("-----"+s2+"------");
    13             s2 += (char)(k+'A');
    14         }
    15     }
    16     
    17     public static void main(String[] args)
    18     {
    19         int[] a = {4,2,2,1,1,3};
    20         
    21         f(a,0,5,"");
    22     }
    23 }

      

  • 相关阅读:
    comet技术
    OCP-1Z0-052-V8.02-120题
    OCP-1Z0-052-V8.02-121题
    OCP-1Z0-052-V8.02-122题
    OCP-1Z0-052-V8.02-124题
    OCP-1Z0-052-V8.02-125题
    OCP-1Z0-052-V8.02-126题
    OCP-1Z0-052-V8.02-127题
    RMAN 备份脚本
    Oracle DB 性能视图和数据字典
  • 原文地址:https://www.cnblogs.com/loveluking/p/6376987.html
Copyright © 2011-2022 走看看