:)A题:门牌制作

&问题描述&

小蓝要为一条街的住户制作门牌号。

这条街一共有2020位住户,门牌号从1到2020编号。

小蓝制作门牌的方法是先制作0到9这几个数字字符,最后根据需要将数字粘贴到门牌上,

例如门牌1017需要依次粘贴字符1、0、1、7、即需要1个字符0,2个字符1,1个字符7.

请问要制作所有的1到2020号门牌,总共需要多少个字符2?

解题方法:暴力枚举

难度:简单

代码实现:

import java.util.Scanner;
public class Main {
public static void main(String[] args) {
    Scanner sc=new Scanner(System.in);
    int count=0;
    for(int i=1;i<=2020;i++)
    {
        String s=i+"";
        for(int j=0;j<s.length();j++) {
            if (s.charAt(j) == '2') {
                count++;
            }
        }
    }
    System.out.println(count);
  }
}

:)试题B寻找2020

<问题描述>

小蓝有一个数字矩阵,里面只包含数字0和2,小蓝很喜欢2020,他想找到这个数字矩阵有多少个2020

小蓝只关注三种构成2020的方式

&同一行里面连续四个字符从左到右构成2020。

&同一行里面连续四个字符从上到下构成2020。

&在一条从左上到右下的斜线上的连续四个字符,从左上到右下构成2020.

例如,对与下面矩阵

220000

000000

002202

000000

000022

002020

一共有5个2020,其中1个是在同一行里,3个是在斜线上。

小蓝的矩阵比上面的矩阵大,由于太大了,他只好将这个矩阵放在一个文件里,在试题目录下有一个2020.txt里面给出了小蓝的矩阵

请帮助小蓝确定他的矩阵有多少个2020.

<解题思路:DFS深度搜索>DFS算法链接>https://oi-wiki.org/search/dfs/

<方法:快速读取BufferedReander,使用readline方法时,当文件内容为空时将返回NULL,通过while(read.readline()!=null)来对文件进行连续读取>

<代码实现>

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.Scanner;
public class Main
{
public static void main(String[] args)
{
    Scanner sc=new Scanner(System.in);
    BufferedReader bf=new BufferedReader(new InputStreamReader(new FileInputStream("D:\\文件地址")));
    String s="";
    char [][]ant=new char[300][];
    int temp=0;
    int count=0;
    while((s=bf.readLine())!=null)
    {
        ant[temp++]=s.toCharArray();
    }
    for(int i=0;i<ant.length;i++)//暴力搜索DFS
    {
        for(int j=0;j<ant.length;j++)
        {
            if(ant[i][j]=='2')
            {
                if(i<ant.length-3&&ant[i+1][j]=='0'&&ant[i+2][j]=='2'&&ant[i+3][j]=='0')
                {
                    count++;//从上往下看
                    //2
                    //0
                    //2
                    //0
                }
                if(j<ant[i].length-3&&ant[i][j+1]=='0'&&ant[i][j+2]=='2'&&ant[i][j+3]=='0')
                {
                    count++;//从左往右看
                    //2020
                }
                if(i<ant.length-3&&j<ant[i].length-3&&ant[i+1][j+1]=='0'&&ant[i+2][j+2]=='2'&&ant[i+3][j+3]=='0')
                {
                    count++;//斜着看
                    //2
                    //  0
                    //    2
                    //      0
                }
            }
        }
    }
    System.out.println(count);

}
}

更新ing ^ ^