矩阵中的1变2

矩阵中的1变2—广度优先搜索

听同学说了一道算法题,大概的意思是在一个N*M矩阵中,这个矩阵中一共有三种元素,{0,1,2},有以下规则:

  • 对于矩阵进行遍历,每次将2周围的1全部变成2,0不变;
  • 每次只能将与2相邻的距离为1的点(上、下、左、右四个)变为2;

求解:

  • 需要遍历多少遍才能将所有的1变成2?

输出

  • 如果可以做到,返回遍历的次数;如果不能,返回-1.

本题有两种做法,第一种,暴力破解法,也就是我同学分享的一种做法,即完全模拟题目中的步骤流程,用两个矩阵轮流进行暴力破解,该方法操作简单,容易实现,但是算法复杂度比较高,这里不再赘述,主要讲第二种方法,图的广度优先搜索算法。

算法思想:

  • 遍历数组(可以看做是图),找到所有的值为2的点,将这些点放入队列;
  • 执行深度优先搜索,比较当前值和下一步的值,如果是0或2,就直接返回;否则,如果下一步是1,就直接将当前值+1放在下一步节点处;否则,如果下一步的值大于当前值+1,就将下一步的节点坐标放入队列,并将下一步的值更新为当前节点的值+1;
  • 当队列为空时,表示搜索完毕,此时遍历数组,找到最大值的点-2即为所得值;如果这时数组中还有1存在,则代表该数组无法完成转换,返回-1。
  1. 数据准备(此部分可以跳过)
static Random random = new Random(System.currentTimeMillis());
    /**
     * 产生初始元素
     * @return
     */
    static int getInitElem(){
   
        int bound = 10;
        // 0,1,2
        int rate[] = {
   2,8};
        int key = random.nextInt(bound);
        if(0<=key&&key<rate[0]){
   
            return 0;
        }else if(0<=key&&key<rate[1]){
   
            return 1;
        }else{
   
            return 2;
        }
    }

    /**
     * 产生一个n*n的方阵
     * @param n 方阵维度
     * @return
     */
    public static int[][] createMatrix(int n,int m){
   
        int matrix[][] = new int[n][];
        for (int i = 0; i < matrix.length; i++) {
   
            matrix[i] = new int[m];
        }
        for (int i = 0; i < matrix.length; i++) {
   
            int row[] = matrix[i];
            for (int j = 0; j < row.length; j++) {
   
                row[j] = getInitElem();
            }
        }
        dispalyMatrix(matrix);
        return matrix;
    }

    /**
     * 显示矩阵,进行数据格式化,用于生成数据
     * @param matrix
     */
    static void dispalyMatrix(int[][] matrix){
   

你可能感兴趣的:(算法,算法,广度优先搜索)