第六届蓝桥杯JAVAB组决赛(2015)

1标题:分机号

X老板脾气古怪,他们公司的电话分机号都是3位数,老板规定,所有号码必须是降序排列,且不能有重复的数位。比如:
751,520,321 都满足要求,而,
766,918,201 就不符合要求。
现在请你计算一下,按照这样的规定,一共有多少个可用的3位分机号码?
请直接提交该数字,不要填写任何多余的内容。
答案:

120

解题过程:

import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        int sum=0;
        for(int i=9;i>=2;i--) {
            for(int j=i;j>=1;j--) {
                for(int q=j;q>=0;q--) {
                    if(i>j&&j>q) {
                        sum++;
                    }
                }
            }
        }
        System.out.println(sum);
    }
}

2标题:五星填数

如【图1.png】的五星图案节点填上数字:1~12,除去7和11。
要求每条直线上数字和相等。
如图就是恰当的填法。
请你利用计算机搜索所有可能的填法有多少种。
注意:旋转或镜像后相同的算同一种填法。
请提交表示方案数目的整数,不要填写任何其它内容。


图1.png

答案:

12

解题过程:
将每个位置进行0-12编号,建立一个数组,角标对应编号,如果满足规则,即成立
采用暴力方法,将所有位置进行全排列,从而得出结果

import java.util.Scanner;
public class Main {
    static int sum=0;
    public static void main(String[] args) {
        int shuru[]={1,2,3,4,5,6,8,9,10,12};
        pailie(shuru,0,shuru.length-1);
    }   
    public static void pailie(int cunchu[],int start,int end) {
        if(start==end) {//交换到最后一位
            shuchu(cunchu);
        }
        else {
            for(int j=start;j<=end;j++) {
                swap(cunchu,start,j);
                pailie(cunchu,start+1,end);
                swap(cunchu,start,j);
            }
        }
    }
    public static void shuchu(int cunchu[]) {//输出
        if(cunchu[0]+cunchu[2]+cunchu[5]+cunchu[8]==24&&cunchu[0]+cunchu[3]+cunchu[6]+cunchu[9]==24&&cunchu[1]+cunchu[5]+cunchu[7]+cunchu[9]==24&&cunchu[8]+cunchu[7]+cunchu[6]+cunchu[4]==24&&cunchu[1]+cunchu[2]+cunchu[3]+cunchu[4]==24) {
            sum++;
            System.out.println("第"+sum+"个是:");
            for(int i=0;i

运行结果:120个
由题目已知旋转或镜像后相同的算同一种填法。
五角星左右对称,即结果应该/2
又旋转,同一个方案可以旋转5次
所以结果/5
So.最终结果为:120/5/2=12种

3标题:显示二叉树

排序二叉树的特征是:
某个节点的左子树的所有节点值都不大于本节点值。
某个节点的右子树的所有节点值都不小于本节点值。
为了能形象地观察二叉树的建立过程,小明写了一段程序来显示出二叉树的结构来。

class BiTree
{
    private int v;
    private BiTree l;
    private BiTree r;
    
    public BiTree(int v){
        this.v = v;
    }
    public void add(BiTree the){
        if(the.v < v){
            if(l==null) l = the;
            else l.add(the);
        }
        else{
            if(r==null) r = the;
            else r.add(the);
        }
    }
    public int getHeight(){
        int h = 2;
        int hl = l==null? 0 : l.getHeight();
        int hr = r==null? 0 : r.getHeight();
        return h + Math.max(hl,hr);
    }
    public int getWidth(){
        int w = (""+v).length();
        if(l!=null) w += l.getWidth();
        if(r!=null) w += r.getWidth();
        return w;
    }
    
    public void show(){
        char[][] buf = new char[getHeight()][getWidth()];
        printInBuf(buf, 0, 0);
        showBuf(buf);
    }
    private void showBuf(char[][] x){
        for(int i=0; ip2) buf[y+1][p3] = '\\';
        
        if(l!=null) l.printInBuf(buf,x,y+2);
        if(r!=null) r.printInBuf(buf,p2+sv.length(),y+2);
    }
    
    private int getRootPos(int x){
        return l==null? x : x + l.getWidth();
    }
}

public class Main
{
    public static void main(String[] args)
    {       
        BiTree tree = new BiTree(500);
        tree.add(new BiTree(200));
        tree.add(new BiTree(509));
        tree.add(new BiTree(100));
        tree.add(new BiTree(250));
        tree.add(new BiTree(507));
        tree.add(new BiTree(600));
        tree.add(new BiTree(650));
        tree.add(new BiTree(450));
        tree.add(new BiTree(510));
        tree.add(new BiTree(440));
        tree.add(new BiTree(220));      
        tree.show();        
    }
}

对于上边的测试数据,应该显示出:
|
/--------------500---
| |
/--200---\ /--509---
| | | |
100 /--250---\ 507 /--600
| | | |
220 /--450 510 650
|
440

(如有对齐问题,请参考【图1.png】)


图1.png

请分析程序逻辑,填写划线部分缺失的代码。
注意,只填写缺少的部分,不要填写已有的代码或符号,也不要加任何说明文字。

4标题:穿越雷区

X星的坦克战车很奇怪,它必须交替地穿越正能量辐射区和负能量辐射区才能保持正常运转,否则将报废。
某坦克需要从A区到B区去(A,B区本身是安全区,没有正能量或负能量特征),怎样走才能路径最短?

已知的地图是一个方阵,上面用字母标出了A,B区,其它区都标了正号或负号分别表示正负能量辐射区。
例如:

A + - + -
- + - - +
- + + + -
+ - + - +
B + - + -

坦克车只能水平或垂直方向上移动到相邻的区。
数据格式要求:
输入第一行是一个整数n,表示方阵的大小, 4<=n<100
接下来是n行,每行有n个数据,可能是A,B,+,-中的某一个,中间用空格分开。
A,B都只出现一次。
要求输出一个整数,表示坦克从A区到B区的最少移动步数。
如果没有方案,则输出-1
例如:
用户输入:

5
A + - + -
- + - - +
- + + + -
+ - + - +
B + - + -

则程序应该输出:
10
资源约定:
峰值内存消耗(含虚拟机) < 512M
CPU消耗 < 2000ms

请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。
所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
注意:不要使用package语句。不要使用jdk1.7及以上版本的特性。
注意:主类的名字必须是:Main,否则按无效代码处理。

import java.util.Scanner;
public class Main {
    static int jilu[][];
    static int sum=0;
    static int bushu=10000;
    static int dis[][] = {{0,1},{1,0},{-1,0},{0,-1}};
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        jilu=new int[n][n];
        sc.nextLine();//解决n后回车未读取问题,如果没有会造成数据少输入一行
        char leiqu[][]=new char[n][n];
        for(int i=0;i

这是目前写的最麻烦的的一道题,还没结局

你可能感兴趣的:(第六届蓝桥杯JAVAB组决赛(2015))