您的位置:首页 > 其它

第七届蓝桥杯大赛省赛-抽签

2018-03-21 21:27 218 查看
抽签

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,"");
}
}


仔细阅读代码,填写划线部分缺少的内容。

注意:不要填写任何已有内容或说明性文字。

解题思路:这题很相似是递归算法,就需要试一下,首先,递归终止条件就是k==a.length,k的初始值就是0,所有k应该是递归加一,其次,在k==a,length成立之时还有一个条件就是n==0,只要满足这个条件就能够输出s的值,n的初始值就是5,所以n应该是减减,而最后一个起初是s,但是s2就会警告,警告原因是s2没有使用,所以就使用s2,推断出f(a,k+1,n-1,s2),但是没有输出结果,就将n-1改为n-i就能输出结果了

package com.lanqiao.seven.Test;

public class Demo05 {
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);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: