十一届蓝桥杯javaB组试题

Posted 山河执手

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了十一届蓝桥杯javaB组试题相关的知识,希望对你有一定的参考价值。

十一届蓝桥杯javaB组试题

以下题目的来源:呆毛王~,我提供自己的解题思路。

算法思想:
暴搜,1到2020一共包含多少个2?

public class Main 
	public static void main(String[] args) 
		int count=0;
		//1到2020一共包含多少个2
		for(int i=1;i<=2020;i++) 
			String temp=i+"";
			for(int j=0;j<temp.length();j++) 
				if(temp.charAt(j)=='2') 
					count++;
				
			
		
		System.out.println(count);
	

#答案:624


算法思想:
考察文件读写,我列了两种方法。

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Scanner;

public class Main 
	public static void main(String[] args) throws IOException 
//		BufferedReader bf = new BufferedReader(new InputStreamReader(new FileInputStream("F:\\\\2020.txt")));
//        String s="";
//        char [][]arr=new char[300][];
//        int cur=0;
//        int ans=0;
//        while((s=bf.readLine())!=null)
//        
//            arr[cur++]=s.toCharArray();
//        
		char[][] arr=new char[300][];
		Scanner scanner=new Scanner(new File("F:\\\\2020.txt"));
		for(int i=0;i<300;i++) 
			arr[i]=scanner.nextLine().toCharArray();
		
		int count=0;
		//暴力搜索
		for(int i=0;i<arr.length;i++) 
			for(int j=0;j<arr[0].length;j++) 
				if(arr[i][j]=='2') 
					//向下判断
					if(i+3<=arr.length-1) 
						if(arr[i+1][j]=='0'&&arr[i+2][j]=='2'&&arr[i+3][j]=='0') 
							count++;
						
					
					//向右判断
					if(j+3<=arr[0].length-1) 
						if(arr[i][j+1]=='0'&&arr[i][j+2]=='2'&&arr[i][j+3]=='0') 
							count++;
						
					
					//向右下角判断
					if(i+3<=arr.length-1&&j+3<=arr[0].length-1) 
						if(arr[i+1][j+1]=='0'&&arr[i+2][j+2]=='2'&&arr[i+3][j+3]=='0') 
							count++;
						
					
				
			
			
		
		System.out.println(count);
	

#答案:16520


算法思想:
模拟,注意数组越界问题

public class Main 
	public static void main(String[] args) 
		int[][] arr=new int[50][50];
		//模拟将数组填满的过程
		arr[0][0]=1;
		//这是我们的起始位置
		int i=0;
		int j=1;
		int count=2;
		while(true) 
			//这是循环终止的条件
			if(arr[19][19]!=0) 
				break;
			
			//从(0,1)位置开始模拟过程
			//从右上到左下
			while(j>0)
				arr[i][j]=count++;
				i++;
				j--;
			
			//此时j=0
			arr[i][j]=count++;
			//向下移一位
			i++;
			//从左下到右上
			while(i>0) 
				arr[i][j]=count++;
				i--;
				j++;
			
			//此时i==0
			arr[i][j]=count++;
			//向右移一位
			j++;
		
		//打印输出
		for(int a=0;a<arr.length;a++) 
			for(int b=0;b<arr[0].length;b++) 
				System.out.print(arr[a][b]+" ");
			
			System.out.println();
		
		System.out.println(arr[19][19]);
	

#答案:761


算法思想:
组合问题+并查集

import java.util.ArrayList;
import java.util.List;

public class Main 
	private static int[] parent=new int[1000];
	private static int[][] arr;
	private static void init(int[] parent) 
		for(int i=0;i<parent.length;i++) 
			parent[i]=i;
		
	
	private static int find(int x) 
        if (x == parent[x]) 
            return x;
         else 
            return parent[x] = find(parent[x]);
        
    

    private static boolean unite(int x, int y) 
        int root1 = find(x);
        int root2 = find(y);
        if (root1 == root2) 
            return false;
        
        parent[root1] = root2;
        return true;
    
	public static void main(String[] args) 
		//组合问题+并查集
		int[] arr1= 1,2,3,4,5,6,7;
		List<List<Integer>> res=new ArrayList<>();
		List<Integer> path=new ArrayList<>();
		arr=new int[8][8];
		arr[1][2] = 1;
        arr[1][6] = 1;
        arr[2][1] = 1;
        arr[2][3] = 1;
        arr[2][7] = 1;
        arr[3][4] = 1;
        arr[3][7] = 1;
        arr[3][2] = 1;
        arr[4][3] = 1;
        arr[4][5] = 1;
        arr[5][4] = 1;
        arr[5][6] = 1;
        arr[5][7] = 1;
        arr[6][1] = 1;
        arr[6][7] = 1;
        arr[6][5] = 1;
        arr[7][2] = 1;
        arr[7][6] = 1;
        arr[7][5] = 1;
        arr[7][3] = 1;
		for(int i=1;i<=7;i++) 
			//这里的i代表了组合的元素个数
			dfs(res,path,arr1,i,1);
		
		
        
		for(List<Integer> elem:res) 
			System.out.println(elem);
		
	
	private static void dfs(List<List<Integer>> res,List<Integer> path,int[] arr1,int n,int begin) 
		if(path.size()==n) 
			//递归终止条件
			if(check(path)) 
				res.add(new ArrayList<>(path));
				return;
			
			return;
		
		for(int i=begin;i<=7;i++) 
			path.add(i);
			dfs(res,path,arr1,n,i+1);
			//回溯
			path.remove(path.size()-1);
		
	
	private static boolean check(List<Integer> list) 
        init(parent);
        for (int i = 0; i < list.size(); i++) 
            for (int j = i + 1; j < list.size(); j++) 
                if (find(list.get(i)) != find(list.get(j)) && arr[list.get(i)][list.get(j)] == 1)
                    //满足连通性,建立连接
                    unite(list.get(i),list.get(j));
                
            
        
        //查看根节点的个数
        int count=0;
        for (int i=0;i<list.size();i++)
            if (parent[list.get(i)]==list.get(i))
                count++;
            
        
        return count==1;
    

答案:80


算法思想:
这题就是算逆序数,我的思想是从26个字母中挑出15个以上的字母为一个组合(14以下就算是完全颠倒都不能到达100),判断该组合的逆序数是否是100.这条题了解思想就好,以下代码修改数据能通过数据规模较小的测试。比如我测试的【a,b,c,d,e,f】中逆序为10的字符串是可以的。

import java.util.ArrayList;
import java.util.List;

public class Main 
	public static void main(String[] args) 
		List<List<Integer>> res=new ArrayList<>();
		List<Integer> path=new ArrayList<>();
		boolean[] used=new boolean[26];
		//从26个字母中挑出15+个
		dfs(res,path,used);
		for(List<Integer> elem:res) 
//			System.out.println(elem);
			for(Integer el:elem) 
				System.out.print((char)(el+'a'));
			
			System.out.println();
		
	
	private static void dfs(List<List<Integer>> res,List<Integer> path,boolean[] used) 
		if(path.size()==15) 
			if(check(path)) 
				res.add(new ArrayList<>(path));
			
		
		for(int i=0;i<26;i++) 
			if(!used[i]) 
				path.add(i);
				used[i]=true;
				dfs(res,path,used);
				used[i]=false;
				path.remove(path.size()-1);
			
			
		
	
	//判断逆序和是否等于100
	private static boolean check(List<Integer> path) 
		int count=0;
		for(int i=0;i<path.size()-1;i++) 
			for(int j=i+1;j<path.第十一届蓝桥杯python组试题解答

2020年软件类第十一届蓝桥杯 省赛 python组(人生苦短,我用python)

第七届蓝桥杯java b组难吗

第十一届蓝桥杯大赛软件类决赛(C/C++ 大学A组)

第六届蓝桥杯大赛个人赛省赛java b组试题 三羊献瑞怎么解

第十一届蓝桥杯B组Java试题答案