您的位置:首页 > 编程语言 > Java开发

第七届蓝桥杯JAVA语言B组_抽签

2017-04-09 10:43 567 查看

题目:抽签

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++){
_____________________________;   //填空位置
//答案为f(a,k+1,n-i,s2);
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);

解析:本体需要考虑递归,一般情况下档f()方法不为void,且刚开始是if判断,可以考虑下是否是递归
首先是判断递归的内容递归f(a,0,5,"")a表示数组,""表示要输出的字符,然后判断0和5,在

if(k==a.length){ 
if(n==0) System.out.println(s);
return;

}

中看出,当k==a.length表示当k的值检验到最后一个公司的时候结束,所以k表示检验到公司的个数,第k公司为为数组的a[k-1],所以a.length表示没公司了

然后n==0,输出。n表示没分配的人数则在空处输入f(a,k+1;n-i;s2);
其中a表示数组,k+1表示要到下一个公司,n-i表示这个公司用了i个名额,还有n-i个名额,

s2为存入的数组,当然,这个是s还是s2可以挨个判断(仅有这两个数组)

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

当有时判断不准某个参数,还不知道是的时候可以进行一个简单的循环即走一遍,把a数组改为{6,6}

然后走一遍

f(a,0,5,"")

判断不等

s2=s

i=0 ..

i=1 ..

i=2 ..

i=3 ..

i=4 ..

i=5 ..

i=6 ..

考虑一个最最简单的i=5;

f(a,x,x,x);然后把自己推断出来的可能答案填里面进行走,判断哪个逻辑错误,再单独修改,可以快速判断

但如果判断对了每个值得情况则不需要
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  第七届 蓝桥杯 抽签