第七届蓝桥杯省赛javaB组-分小组

分小组

9名运动员参加比赛,需要分3组进行预赛。
有哪些分组的方案呢?

我们标记运动员为 A,B,C,… I
下面的程序列出了所有的分组方法。

该程序的正常输出为:
ABC DEF GHI
ABC DEG FHI
ABC DEH FGI
ABC DEI FGH
ABC DFG EHI
ABC DFH EGI
ABC DFI EGH
ABC DGH EFI
ABC DGI EFH
ABC DHI EFG
ABC EFG DHI
ABC EFH DGI
ABC EFI DGH
ABC EGH DFI
ABC EGI DFH
ABC EHI DFG
ABC FGH DEI
ABC FGI DEH
ABC FHI DEG
ABC GHI DEF
ABD CEF GHI
ABD CEG FHI
ABD CEH FGI
ABD CEI FGH
ABD CFG EHI
ABD CFH EGI
ABD CFI EGH
ABD CGH EFI
ABD CGI EFH
ABD CHI EFG
ABD EFG CHI
….. (以下省略,总共560行)。

public class A
{
    public static String remain(int[] a)
    {
        String s = "";
        for(int i=0; i<a.length; i++){
            if(a[i] == 0) s += (char)(i+'A');
        }   
        return s;
    }

    public static void f(String s, int[] a)
    {
        for(int i=0; i<a.length; i++){
            if(a[i]==1) continue;
            a[i] = 1;
            for(int j=i+1; j<a.length; j++){
                if(a[j]==1) continue;
                a[j]=1;
                for(int k=j+1; k<a.length; k++){
                    if(a[k]==1) continue;
                    a[k]=1;
                    System.out.println(_);  //填空位置
                    a[k]=0;
                }
                a[j]=0;
            }
            a[i] = 0;
        }
    }

    public static void main(String[] args)
    {
        int[] a = new int[9];       
        a[0] = 1;

        for(int b=1; b<a.length; b++){
            a[b] = 1;
            for(int c=b+1; c<a.length; c++){
                a[c] = 1;
                String s = "A" + (char)(b+'A') + (char)(c+'A');
                f(s,a);
                a[c] = 0;
            }
            a[b] = 0;
        }
    }
}

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

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

这道题不需要花费太多时间去看代码,在这个时间看代码可能有些不值得,需要找到一些解题技巧,首先,先看看这个循环所输出的字符串s是多少

package com.lanqiao.seven.Test;

public class Demo04 {

    public static String remain(int[] a)
    {
        String s = "";
        for(int i=0; i<a.length; i++){
            if(a[i] == 0) s += (char)(i+'A');
        }   
        return s;
    }

    public static void f(String s, int[] a)
    {
        for(int i=0; i<a.length; i++){
            if(a[i]==1) continue;
            a[i] = 1;
            for(int j=i+1; j<a.length; j++){
                if(a[j]==1) continue;
                a[j]=1;
                for(int k=j+1; k<a.length; k++){
                    if(a[k]==1) continue;
                    a[k]=1;
                    System.out.println(s);  //填空位置
                    a[k]=0;
                }
                a[j]=0;
            }
            a[i] = 0;
        }
    }

    public static void main(String[] args)
    {
        int[] a = new int[9];       
        a[0] = 1;

        for(int b=1; b<a.length; b++){
            a[b] = 1;
            for(int c=b+1; c<a.length; c++){
                a[c] = 1;
                String s = "A" + (char)(b+'A') + (char)(c+'A');
                f(s,a);
                a[c] = 0;
            }
            a[b] = 0;
        }
    }
}

输出的结果如下:
ABC
ABC
ABC
ABC
ABC
ABC
ABC
ABC
ABC
ABC
ABC
ABC
ABC
ABC
ABC
ABC
ABC
ABC
………………

通过这个可以看出是第一列的数,那么接下来我们看出一个方法(remain)在程序任何位置都没有使用,也可以看看它输出什么

package com.lanqiao.seven.Test;

public class Demo04 {

    public static String remain(int[] a)
    {
        String s = "";
        for(int i=0; i<a.length; i++){
            if(a[i] == 0) s += (char)(i+'A');
        }   
        return s;
    }

    public static void f(String s, int[] a)
    {
        for(int i=0; i<a.length; i++){
            if(a[i]==1) continue;
            a[i] = 1;
            for(int j=i+1; j<a.length; j++){
                if(a[j]==1) continue;
                a[j]=1;
                for(int k=j+1; k<a.length; k++){
                    if(a[k]==1) continue;
                    a[k]=1;
                    System.out.println(remain(a));  //填空位置
                    a[k]=0;
                }
                a[j]=0;
            }
            a[i] = 0;
        }
    }

    public static void main(String[] args)
    {
        int[] a = new int[9];       
        a[0] = 1;

        for(int b=1; b<a.length; b++){
            a[b] = 1;
            for(int c=b+1; c<a.length; c++){
                a[c] = 1;
                String s = "A" + (char)(b+'A') + (char)(c+'A');
                f(s,a);
                a[c] = 0;
            }
            a[b] = 0;
        }
    }
}

输出的结果如下所示:
GHI
FHI
FGI
FGH
EHI
EGI
EGH
EFI
EFH
EFG
DHI
DGI
DGH
DFI
DFH
DFG
DEI
DEH
DEG
DEF
GHI
……………………
通过输出的结果可以看出这是第三列的结果,那么接下来还缺的就是第二列的结果,那么我们需要想一下,第二列得字母就是除去第一列和第三列之后剩余的数,那么,我们可以借用一下式子(出现的频率比较多),即:s += (char)(i+’A’),不过我们需要进行修改(按照出题人思路,应该是外圈开始拼写,一直到内圈),相应的代码如下所示:

package com.lanqiao.seven.Test;

public class Demo04 {

    public static String remain(int[] a)
    {
        String s = "";
        for(int i=0; i<a.length; i++){
            if(a[i] == 0) s += (char)(i+'A');
        }   
        return s;
    }

    public static void f(String s, int[] a)
    {
        for(int i=0; i<a.length; i++){
            if(a[i]==1) continue;
            a[i] = 1;
            for(int j=i+1; j<a.length; j++){
                if(a[j]==1) continue;
                a[j]=1;
                for(int k=j+1; k<a.length; k++){
                    if(a[k]==1) continue;
                    a[k]=1;
                    System.out.println(""+(char)(i+'A')+(char)(j+'A')+(char)(k+'A'));  //填空位置
                    a[k]=0;
                }
                a[j]=0;
            }
            a[i] = 0;
        }
    }

    public static void main(String[] args)
    {
        int[] a = new int[9];       
        a[0] = 1;

        for(int b=1; b<a.length; b++){
            a[b] = 1;
            for(int c=b+1; c<a.length; c++){
                a[c] = 1;
                String s = "A" + (char)(b+'A') + (char)(c+'A');
                f(s,a);
                a[c] = 0;
            }
            a[b] = 0;
        }
    }
}

输出的结果如下所示:
DEF
DEG
DEH
DEI
DFG
DFH
DFI
DGH
DGI
DHI
EFG
EFH
…………………………

那么就是第二列的数了,那么综合以上推断,可以得出以下代码:

package com.lanqiao.seven.Test;

public class Demo04 {

    public static String remain(int[] a)
    {
        String s = "";
        for(int i=0; i<a.length; i++){
            if(a[i] == 0) s += (char)(i+'A');
        }   
        return s;
    }

    public static void f(String s, int[] a)
    {
        for(int i=0; i<a.length; i++){
            if(a[i]==1) continue;
            a[i] = 1;
            for(int j=i+1; j<a.length; j++){
                if(a[j]==1) continue;
                a[j]=1;
                for(int k=j+1; k<a.length; k++){
                    if(a[k]==1) continue;
                    a[k]=1;
                    System.out.println(s+" "+(char)(i+'A')+(char)(j+'A')+(char)(k+'A')+" "+remain(a));  //填空位置
                    a[k]=0;
                }
                a[j]=0;
            }
            a[i] = 0;
        }
    }

    public static void main(String[] args)
    {
        int[] a = new int[9];       
        a[0] = 1;

        for(int b=1; b<a.length; b++){
            a[b] = 1;
            for(int c=b+1; c<a.length; c++){
                a[c] = 1;
                String s = "A" + (char)(b+'A') + (char)(c+'A');
                f(s,a);
                a[c] = 0;
            }
            a[b] = 0;
        }
    }
}

结果是:s+” “+(char)(i+’A’)+(char)(j+’A’)+(char)(k+’A’)+” “+remain(a)

### 蓝桥杯个人 Java B 题型及考试范围 #### 一、题型概述 蓝桥杯个人针对Java B的比题目通常涵盖了多个方面,旨在全面考察参者的编程能力以及算法思维。比中的题目形式多样,包括但不限于选择题、填空题、程序设计题等。 #### 二、具体题型分析 ##### (一)基础概念理解 这类题目主要测试选手对计算机基础知识的理解程度,比如数据结构的选择与应用、基本语法掌握情况等。例如,在往年的比中曾出现过关于字符串处理、数操作等方面的知识点考查[^1]。 ##### (二)逻辑推理与简单算法实现 此类问题往往给出一定的情景描述或规则设定,要求根据给定条件编写能够解决问题的小段代码或者直接写出解法思路。像提到的幸运数字问题,就需要利用特定规律来筛选符合条件的结果并对其进行适当运算处理[^3]。 ##### (三)复杂度较高的算法挑战 随着难度增加,部分考题会涉及到更深层次的数据结构运用或是较为复杂的算法模型构建。以REPEAT程序为例,这道题不仅考验了循环语句的应用技巧,还隐含着优化时间空间效率的要求;而有关于病毒检测方案的设计,则引入了数学建模的思想去寻找最优分策略[^2]。 ##### (四)综合项目开发模拟 有时也会设置一些贴近实际应用场景的任务场景,让考生在一个相对完整的框架下完成指定功能模块的编码工作。上述提供的阶乘累加案例即属于这一范畴——它既包含了函数定义调用的基础训练,又加入了大数取余这样具有现实意义的操作细节。 #### 三、注意事项 - 对于所有涉及数值计算的回答,应当注意按照规定的方式进行结果截断或取模运算,确保最终输出符合标准格式[^4]。 - 此外,某些特殊类型的布局排列问题也可能成为考点之一,如纸牌摆放模式下的路径规划等[^5]。 ```java // 示例:如何在Java中执行简单的取模运算 public class ModExample { public static void main(String[] args) { int result = (int)(Math.pow(2, 31) % 1000000007); System.out.println(result); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值