第十届蓝桥杯省赛java大学b组题目及解析

2021/4/24 14:25:37

本文主要是介绍第十届蓝桥杯省赛java大学b组题目及解析,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

一、填空题
试题A:组队
在这里插入图片描述
在这里插入图片描述
简单题,不做过多解析,直接上代码

枚举代码:

import java.util.Scanner;
public class A{
	static int ans=0,sum=0;
	static int[][] a= 
		{{0,0,0,0,0,0},{0,97,90,0,0,0},{0,92,85,96,0,0},{0,0,0,0,0,93},{0,0,0,0,80,86},
		{0,89,83,97,0,0},{0,82,86,0,0,0},{0,0,0,0,87,90},{0,0,97,96,0,0},
		{0,0,0,89,0,0},{0,95,99,0,0,0},{0,0,0,96,97,0},{0,0,0,0,93,98},
		{0,94,91,0,0,0},{0,0,83,87,0,0},{0,0,0,98,97,98},{0,0,0,0,93,86},
		{0,98,83,99,98,81},{0,93,87,92,96,98},{0,0,0,0,89,92},{0,0,99,96,95,81}};
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		int i,j,k,l,m;
		for(i=1;i<=20;i++)
			for(j=1;j<=20;j++)
				for(k=1;k<=20;k++)
					for(l=1;l<=20;l++)
						for(m=1;m<=20;m++) 
							if(i!=j&&i!=k&&i!=l&&i!=m&&j!=k&&j!=l&&j!=m&&k!=l&&k!=m&&l!=m) {
								sum=a[i][1]+a[j][2]+a[k][3]+a[l][4]+a[m][5];
								ans=Math.max(ans,sum);
							}
		System.out.print(ans);
	}
}

搜索代码(这里搜索实际上跟枚举没啥区别):

import java.util.Scanner;
public class A {
	static int ans;
	static int[] visited=new int[21];
	static int[][] a= 
		{{0,0,0,0,0,0},{0,97,90,0,0,0},{0,92,85,96,0,0},{0,0,0,0,0,93},{0,0,0,0,80,86},
		{0,89,83,97,0,0},{0,82,86,0,0,0},{0,0,0,0,87,90},{0,0,97,96,0,0},
		{0,0,0,89,0,0},{0,95,99,0,0,0},{0,0,0,96,97,0},{0,0,0,0,93,98},
		{0,94,91,0,0,0},{0,0,83,87,0,0},{0,0,0,98,97,98},{0,0,0,0,93,86},
		{0,98,83,99,98,81},{0,93,87,92,96,98},{0,0,0,0,89,92},{0,0,99,96,95,81}};
	public static void dfs(int n,int s) {
		if(n==6) {
			ans=Math.max(ans,s);
			return;
		}
		int i;
		for(i=1;i<=20;i++)
			if(visited[i]==0) {
				visited[i]=1;
				dfs(n+1,s+a[i][n]);
				visited[i]=0;
			}
	}
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		dfs(1,0);
		System.out.print(ans);
	}
}
答案:490

试题B:不同子串
在这里插入图片描述
解析:注意最后一句,只算本质不同的串的个数,在java中我们可以利用HashSet的去重性在存储各子串(通过循环变量i和j,利用String类的substring方法选出子串去存储到Set中),最后统计HashSet的大小输出即可。
上代码:

import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;
public class B {
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		String s=sc.next();
		Set<String> set=new HashSet<>();
		int i,j;
		for(i=0;i<s.length();i++) 
			for(j=i;j<s.length();j++) 
				set.add(s.substring(i, j+1));
		System.out.println(set.size());
	}
}
答案:100

试题C:数列求值

在这里插入图片描述
解析:此题有一个陷阱,那就是不能一直算下去,会数据溢出。
由于只求最后四位数字那么我们计算后四位即可,把每次相加的结果取余10000存起来。
上代码:

import java.util.Scanner;
public class C {
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		int i;
		int[] f=new int[20190325];
		f[1]=f[2]=f[3]=1;
		for(i=4;i<=20190324;i++)
			f[i]=(f[i-1]+f[i-2]+f[i-3])%10000;
		System.out.print(f[20190324]);
	}
}
答案:4659

试题D:数的分解
在这里插入图片描述
解析:这个题没啥难度,不过有一个小坑,通过三个循环变量i,j,k枚举三个正整数,最后统计出来的结果需要除以6而不是3,要除的是三个数的排列顺序一共是6个而不是三个循环变量的数目!!!
上代码:

import java.util.Scanner;
public class D {
	static int ans=0;
	public static boolean Is(int x) {
		String s=String.valueOf(x);
		for(int i=0;i<s.length();i++) {
			if(s.charAt(i)=='2'||s.charAt(i)=='4')
				return false;
		}
		return true;
	}
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		int i,j,k;
		for(i=1;i<=2019;i++) 
			for(j=1;j<=2019-i;j++)
				for(k=1;k<=2019-i-j;k++) {
					if(i+j+k==2019&&Is(i)&&Is(j)&&Is(k)&&i!=j&&i!=k&&j!=k)
						ans++;
				}
		ans=ans/6;
		System.out.print(ans);
	}
}

答案:40785

试题E:迷宫
在这里插入图片描述
在这里插入图片描述
代码实现(BFS)

import java.util.Scanner;
import java.util.Queue;
import java.util.LinkedList;
public class lq迷宫 {
    final static int n=30,m=50;
    static int[][] map,lu;
    static int[] dx={1,0,0,-1},dy={0,-1,1,0};
    static Queue<pair> q;
    static pair cur;
    public static void Print(){
        StringBuffer sb=new StringBuffer();
        int a=n,b=m,k;
        while(true){
            k=lu[a][b];
            switch(k){
                case -1:
                    sb.reverse();
                    System.out.println(sb);
                    System.out.println(sb.length());
                    return;
                case 0:
                    sb.append("D");
                    break;
                case 1:
                    sb.append("L");
                    break;
                case 2:
                    sb.append("R");
                    break;
                case 3:
                    sb.append("U");
                    break;
            }
            a-=dx[k];
            b-=dy[k];
        }
    }
    public static void bfs(int x,int y,int d){
        q=new LinkedList<>();
        map[x][y]=1;    //标记为走过
        q.add(new pair(x,y,d));       //入队
        int tx,ty,i;
        while(!q.isEmpty()){
            cur=q.remove();         //出队
            x=cur.x;
            y=cur.y;
            d=cur.d;
            lu[x][y]=d;          //保存路径(这个点由哪个方向来的)
            if(x==n&&y==m){
                return;
            }
            for(i=0;i<4;i++){
                tx=x+dx[i];
                ty=y+dy[i];
                if(tx>=1&&tx<=n&&ty>=1&&ty<=m&&map[tx][ty]==0){
                    map[tx][ty]=1;    //标记为走过
                    q.add(new pair(tx,ty,i));      //入队
                }
            }
        }
    }
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        int i,j;
        String str=new String();
        map=new int[n+1][m+1];
        lu=new int[n+1][m+1];
        for(i=1;i<=n;i++){
            str=sc.next();
            for(j=1;j<=m;j++)
                map[i][j]=str.charAt(j-1)-'0';
        }
        bfs(1,1,-1);
        Print();
    }
    static class pair{
        int x,y,d;
        public pair(){

        }
        public pair(int a,int b,int c){
            this.x=a;
            this.y=b;
            this.d=c;
        }
    }
}

答案:
DDDDRRURRRRRRDRRRRDDDLDDRDDDDDDDDDDDDRDDRRRURRUURRDDDDRDRRRRRRDRRURRDDDRRRRUURUUUUUUULULLUUUURRRRUULLLUUUULLUUULUURRURRURURRRDDRRRRRDDRRDDLLLDDRRDDRDDLDDDLLDDLLLDLDDDLDDRRRRRRRRRDDDDDDRR

试题F:特别数的和
在这里插入图片描述
代码

import java.util.*;
public class F {
	static String str;
	static int sum=0;
	public static boolean Is(int x) {
		str=String.valueOf(x);
		for(int i=0;i<str.length();i++)
			if(str.charAt(i)=='2'||str.charAt(i)=='0'||str.charAt(i)=='1'||str.charAt(i)=='9')
				return true;
		return false;
	}
	public static void main(String[] args){
		Scanner sc=new Scanner(System.in);
		int i,n=sc.nextInt();
		for(i=1;i<=n;i++) {
			if(Is(i))
				sum+=i;
		}
		System.out.print(sum);
	}
}



这篇关于第十届蓝桥杯省赛java大学b组题目及解析的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程