2020年第十一届蓝桥杯决赛JAVA B组 扩散

问题描述

小蓝在一张无限大的特殊画布上作画。
这张画布可以看成一个方格图,每个格子可以用一个二维的整数坐标表示。
小蓝在画布上首先点了一下几个点:( 0 , 0),( 2020 , 11 ),( 11 , 14 ),( 2000, 2000 )。只有这几个格子上有黑色,其它位置都是白色的。
每过一分钟,黑色就会扩散一点。具体的,如果一个格子里面是黑色,它就会扩散到上、下、左、右四个相邻的格子中,使得这四个格子也变成黑色(如果原来就是黑色,则还是黑色)。
请问,经过 2020 分钟后,画布上有多少个格子是黑色的。

解题思路

通过模拟的思想,可以画出几个,找出其中的规律

经过2020分钟后,一个点的上下左右最多加2020。由于题目中说的是无限大的画布,考虑到数组下标不能为负数,所以我们可以将0,0这个点平移(3000,3000),相应的,其他点也加(3000,3000)这样做的好处是,经过2020次,下标一定大于0。这里开辟了一个[10000][10000]的数组,也可以不用这么大,最多遍历整个数组,如果值为1的话,则说明变成黑色了,cnt++即可。

代码


public class Main{

    static int[][] graph = new int[10000][10000];
    static void func(int x,int y)
    {
        int t = 0;
        // 左半部分
        for(int i= x-2020;i<=x-1;i++)
        {
            for(int j=y-t;j<=y+t;j++)
            {
                //System.out.println(i+" "+j);
                graph[i][j] = 1;
            }
            t++;
        }
        // 中间部分
        for(int i=y-2020;i<=y+2020;i++)
            graph[x][i] = 1;

        t = 0;
        // 右半部分
        for(int i= x+2020;i>=x+1;i--)
        {
            for(int j=y-t;j<=y+t;j++)
            {
                graph[i][j] = 1;
            }
            t++;
        }
    }

    public static void main(String[] args) {

       graph[0+3000][0+3000] = 1;
       graph[2020+3000][11+3000] = 1;
       graph[11+3000][14+3000] = 1;
       graph[2000+3000][2000+3000] = 1;
       func(3000,3000);
       func(2020+3000,11+3000);
       func(11+3000,14+3000);
       func(2000+3000,2000+3000);
       int cnt = 0;
       for(int i=0;i<10000;i++)
       {
           for(int j=0;j<10000;j++)
           {
               if(graph[i][j]==1)
                   cnt++;
           }
       }
       System.out.println(cnt);
    }
}

答案

20312088

你可能感兴趣的:(蓝桥杯刷题,蓝桥杯,算法)