2019蓝桥杯B组国赛

试题 A: 递增序列

【问题描述】
对于一个字母矩阵,我们称矩阵中的一个递增序列是指在矩阵中找到两个字母,
它们在同一行,同一列,或者在同一 45 度的斜线上,这两个字母从左向 右看、或者从上向下看是递增的。
例如,如下矩阵中
LANN 
QIAO 
有LN、LN、AN、AN、IO、AO、LQ、AI、NO、NO、AQ、IN、AN 等 13 个 递增序列。
注意当两个字母是从左下到右上排列时,从左向右看和从上向下看 是不同的顺序。
 对于下面的 30 行 50 列的矩阵,请问总共有多少个递增序列?
 (如果你把 以下文字复制到文本文件中,请务必检查复制的内容是否与文档中的一致。
 在试题目录下有一个文件 inc.txt,内容与下面的文本相同)

VLPWJVVNNZSWFGHSFRBCOIJTPYNEURPIGKQGPSXUGNELGRVZAG
SDLLOVGRTWEYZKKXNKIRWGZWXWRHKXFASATDWZAPZRNHTNNGQF
ZGUGXVQDQAEAHOQEADMWWXFBXECKAVIGPTKTTQFWSWPKRPSMGA
BDGMGYHAOPPRRHKYZCMFZEDELCALTBSWNTAODXYVHQNDASUFRL
YVYWQZUTEPFSFXLTZBMBQETXGXFUEBHGMJKBPNIHMYOELYZIKH
ZYZHSLTCGNANNXTUJGBYKUOJMGOGRDPKEUGVHNZJZHDUNRERBU
XFPTZKTPVQPJEMBHNTUBSMIYEGXNWQSBZMHMDRZZMJPZQTCWLR
ZNXOKBITTPSHEXWHZXFLWEMPZTBVNKNYSHCIQRIKQHFRAYWOPG
MHJKFYYBQSDPOVJICWWGGCOZSBGLSOXOFDAADZYEOBKDDTMQPA
VIDPIGELBYMEVQLASLQRUKMXSEWGHRSFVXOMHSJWWXHIBCGVIF
GWRFRFLHAMYWYZOIQODBIHHRIIMWJWJGYPFAHZZWJKRGOISUJC
EKQKKPNEYCBWOQHTYFHHQZRLFNDOVXTWASSQWXKBIVTKTUIASK
PEKNJFIVBKOZUEPPHIWLUBFUDWPIDRJKAZVJKPBRHCRMGNMFWW
CGZAXHXPDELTACGUWBXWNNZNDQYYCIQRJCULIEBQBLLMJEUSZP
RWHHQMBIJWTQPUFNAESPZHAQARNIDUCRYQAZMNVRVZUJOZUDGS
PFGAYBDEECHUXFUZIKAXYDFWJNSAOPJYWUIEJSCORRBVQHCHMR
JNVIPVEMQSHCCAXMWEFSYIGFPIXNIDXOTXTNBCHSHUZGKXFECL
YZBAIIOTWLREPZISBGJLQDALKZUKEQMKLDIPXJEPENEIPWFDLP
HBQKWJFLSEXVILKYPNSWUZLDCRTAYUUPEITQJEITZRQMMAQNLN
DQDJGOWMBFKAIGWEAJOISPFPLULIWVVALLIIHBGEZLGRHRCKGF
LXYPCVPNUKSWCCGXEYTEBAWRLWDWNHHNNNWQNIIBUCGUJYMRYW
CZDKISKUSBPFHVGSAVJBDMNPSDKFRXVVPLVAQUGVUJEXSZFGFQ
IYIJGISUANRAXTGQLAVFMQTICKQAHLEBGHAVOVVPEXIMLFWIYI
ZIIFSOPCMAWCBPKWZBUQPQLGSNIBFADUUJJHPAIUVVNWNWKDZB
HGTEEIISFGIUEUOWXVTPJDVACYQYFQUCXOXOSSMXLZDQESHXKP
FEBZHJAGIFGXSMRDKGONGELOALLSYDVILRWAPXXBPOOSWZNEAS
VJGMAOFLGYIFLJTEKDNIWHJAABCASFMAKIENSYIZZSLRSUIPCJ
BMQGMPDRCPGWKTPLOTAINXZAAJWCPUJHPOUYWNWHZAKCDMZDSR
RRARTVHZYYCEDXJQNQAINQVDJCZCZLCQWQQIKUYMYMOVMNCBVY
ABTCRRUXVGYLZILFLOFYVWFFBZNFWDZOADRDCLIRFKBFBHMAXX

【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。
本题的结果为一 个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

思路

  1. 遍历输入的每一个元素
  2. 每一个元素都与自己同行同列同斜线的进行比较,如果是从左往右或从上往下是递增的话那就统计次数+1
  3. 如果是从左往上看的斜线分两种情况:(1)只看左右不看上下(2)只看上下不看左右,也就是说这种情况的时候,只要两个元素不想等就可以统计次数+1,不过代码里面我还是进行了2此判断,这样更容易看懂
    代码
package com.pning;

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        demo_1();
    }


    public static long count_1=0;
    public static char[][] arr_1 = new char[30][50];
    public static void demo_1(){
        Scanner e = new Scanner(System.in);
        //输入
	    for(int i=0;i<arr_1.length;i++){
            arr_1[i] = e.nextLine().toCharArray();
        }
	   //遍历每一个元素
	    for(int i=0;i<arr_1.length;i++){
	        for(int j=0;j<arr_1[i].length;j++){
                count_1(i,j);
            }
        }
	    System.out.println(count_1);
    }

    /**
     * 统计该位置的元素有多少个递增序列
     * @param x
     * @param y
     */
    public static void count_1(int x,int y){
        char temp = arr_1[x][y];
        //同一行
        for(int i=y+1;i<arr_1[x].length;i++){
            if(arr_1[x][i]>temp){
                count_1++;
                //System.out.println("同一行"+temp+""+arr_1[x][i]);
            }
        }
        //同一列
        for(int i=x+1;i<arr_1.length;i++){
            if(arr_1[i][y]>temp){
                //System.out.println("同一列"+temp+""+arr_1[i][y]);
                count_1++;
            }
        }
        //同一45°斜线
        //从左往下看时候
        for(int i=x+1,j=y+1;i<arr_1.length && j<arr_1[i].length;i++,j++){
            if(arr_1[i][j]>temp){
                //System.out.println("同一45°斜线左往下"+temp+""+arr_1[i][j]);
                count_1++;
            }
        }
        //从左往上看
        for(int i=x+1,j=y-1;i<arr_1.length && j>=0;i++,j--){
            //从左往右
            if(arr_1[i][j]<temp){
               //System.out.println("同一45°斜线右往上(左往右)"+arr_1[i][j]+""+temp);
                count_1++;
            }
            //从上往下
            if(arr_1[i][j]>temp){
                //System.out.println("同一45°斜线右往上(上往下)"+temp+""+arr_1[i][j]);
                count_1++;
            }
        }
    }
}

答案:52800

试题 B: 平方拆分

【问题描述】
 将 2019 拆分为若干个两两不同的完全平方数之和,一共有多少种不同的方
 法?
 注意交换顺序视为同一种方法,例如 132 + 252 + 352 = 2019 与 132 + 352 +
 252 = 2019 视为同一种方法。
 【答案提交】
 这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一
 个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分

思路

  1. 首先计算出如果选取最小值需要多少个数才能达到大于等于2019,也就是求1-x得平方和大于等于2019时,x的值是多少
  2. 求出1-2019中那个数的平方是等于2019或者大于2019且最接近2019的
  3. 通过前两步我们可以发现最多需要18个数我们就可以得到一个大于等于2019的值,当只取1个数的时候45的平方已经大于2019,即值得范围只需要在1-45中取即可
  4. 最好的方法就是循环取得个数,然后每次循环都使用背包算法,把取值的个数当成背包的容量,把取到值的所有平方和当成价值进行运算。
  5. 但是吧。。。。。。我不,这明明是填空题,递归回溯枚举不香么
    在这里插入图片描述
    运行时间有一丢丢长,但是如果是填空题的话还是很香的,如果要使用背包的话把dfs_2方法改成背包算法就可以了
package com.pning;

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        demo_2();
    }

    /*
    思路:
     */
    public static int count_2=0;
    public static int maxCount_2  = maxCount_2();           //至多18个数的平方和就可以得到一个大于等于2019的数
    public static int maxNum_2 = maxNum_2()+1;               //查询可以选择的最大范围,44的平方是小于等于2019的最大值
    public static void demo_2(){
        for(int i=1;i<=maxCount_2;i++){          //需要多少个元素组成2019
            dfs_2(0,i,1);
        }
        System.out.println(count_2);
    }

    /**
     *
     * @param rs        求和结果
     * @param count      还可以使用的元素个数
     * @param now       目前的元素的值
     */
    public static void dfs_2(int rs, int count, int now){
        if(rs==2019&&count==0){
            count_2++;
            return;
        }else if(rs>2019){
            return;
        }else if(count==0){
            return;
        }else if(now==maxNum_2){
            return;
        }
        dfs_2(rs,count,now+1);
        dfs_2(rs+now*now, count-1, now+1);
    }
    /**
     * 获取至少要多少个数的平方和才能得到一个大于等于2019的值
     * @return
     */
    public static int maxCount_2(){
        int sum=0;
        for(int i=1;i<=2019;i++){
            sum=sum+i*i;
            if(sum>=2019){
                return i;
            }
        }
        return -1;
    }
    /**
     * 可以选择的最大值
     * @return
     */
    public static int maxNum_2(){
        for(int i=1;i<=50;i++){
            if(i*i>=2019){
                return i-1;
            }
        }
        return -1;
    }
}

答案:26287

试题 C: 切割

【问题描述】
 在 4×4 的方格矩阵中画一条直线。
则直线穿过的方格集合有多少种不同的可能? 
这个里直线穿过一个方格当且仅当直线将该方格分割成面积都大于 0 的两 部分。
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。
本题的结果为一 个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

思路
…我看不懂这题目想说啥。。。。。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值