华为od机试,计算疫情扩散天数

题目:一个n*n的区域,每个位置为1或0,        1代表感染,0代表未感染,每隔一天,位置为1的会将上下左右为0的感染,即如果0的上下左右存在1,则一天后0会被感染为1;

给定任意一个字符串(字符串长度为n^2)以“,”分割,计算全部感染所需天数,并输出

如 输入1,0,1,0,0,0,1,0,1

则 矩阵为

1,        0,        1

0,        0,        0

1,        0,        1

一天后

1,        1,        1

1,        0,        1

1,        1,        1

两天后

1,        1,        1

1,        1,        1

1,        1,        1

则输出结果为2;如果输入字符串全部为1或0(即全部已感染或全部未感染),则输出结果为-1。

public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String s = sc.next();
        long timeStart= System.currentTimeMillis();
        String[] sp = s.split(",");
        int a=0;
        int b=0;
        int n = (int) Math.sqrt((double) sp.length);
        String[][] str = new String[n][n];
        int[][] tmp = new int[n][n];

        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                str[i][j]=sp[a];
                a++;
                b+=Integer.valueOf(str[i][j]);
            }
        }
        if (b==0||b==sp.length){
            System.out.println(-1);
            System.exit(0);
        }
        int count = 0;
        int flag = 0;
        while (count < sp.length){
            count=0;
            /** 将str的值赋给tmp*/

        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                tmp[i][j]=Integer.valueOf(str[i][j]);
                a++;
            }
        }
        /**循环遍历,如果某个值的上下左右有一个为1则将该位置值设为1*/
            for (int i = 0; i < n; i++) {
                for (int j = 0; j < n; j++) {
                    try{
                        if (Integer.valueOf(str[i-1][j])==1){
                            tmp[i][j]=1;
                        }
                    }catch (ArrayIndexOutOfBoundsException e){
                    }
                    try{
                        if (Integer.valueOf(str[i+1][j])==1){
                            tmp[i][j]=1;
                        }
                    }catch (ArrayIndexOutOfBoundsException e){
                    }
                    try{
                        if (Integer.valueOf(str[i][j-1])==1){
                            tmp[i][j]=1;
                        }
                    }catch (ArrayIndexOutOfBoundsException e){
                    }
                    try{
                        if (Integer.valueOf(str[i][j+1])==1){
                            tmp[i][j]=1;
                        }
                    }catch (ArrayIndexOutOfBoundsException e){
                    }
                }
            }
            /** 将tmp的值赋给str */
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                str[i][j]=String.valueOf(tmp[i][j]);
            }
        }
            for (int i = 0; i < n; i++) {
                for (int j = 0; j < n; j++) {
                    count+=tmp[i][j];
                }
            }
            flag++;
        }

            System.out.println(flag);
        //程序运行时间
        System.out.println("程序运行时间:"+(System.currentTimeMillis()-timeStart)+"ms");
    }

你可能感兴趣的:(java,算法,开发语言)