蓝桥杯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 classMain {2 public static void f(int[] a, int k, intn, 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 voidmain(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, intn, 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 classMain {2 public static void f(int[] a, int k, intn, 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 voidmain(String[] args)18 {19 int[] a = {4,2,2,1,1,3};20

21 f(a,0,5,"");22 }23 }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值