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

来源:互联网 发布:c语言从看懂到看开 编辑:程序博客网 时间:2024/05/16 23:37

题目:抽签

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);然后把自己推断出来的可能答案填里面进行走,判断哪个逻辑错误,再单独修改,可以快速判断
但如果判断对了每个值得情况则不需要



0 0
原创粉丝点击