Java:矩阵中最长的岛

时间:2017-03-06 06:58:49

标签: java

您好我正在尝试执行一个代码,该代码以1和0的矩阵返回1的岛的最大长度。

在1和0的矩阵中,如果矩阵的两个相邻元素是1,则它们可以形成岛。矩阵可以有多个岛。相邻元素可以是水平,垂直或对角线。

这是逻辑:

import java.util.Arrays;

public class IslandMatrix {


    static final int ROW = 5, COL = 5;
    static int max_1 = 0;
    public boolean isSafe(int M[][], int row, int col,
                   boolean visited[][])
    {
        if( (row >= 0) && (row < ROW) &&
               (col >= 0) && (col < COL) &&
               (M[row][col]==1 && !visited[row][col])){
            return true;
        }
        return false;
    }


    int DFS(int M[][], int row, int col, boolean visited[][])
    {
        max_1 = max_1+1;
        int rowNbr[] = new int[] {-1,  0,  1, -1, 1, -1, 0, 1};
        int colNbr[] = new int[] {-1, -1, -1,  0, 0,  1, 1, 1};
        visited[row][col] = true;
        for (int k = 0; k < 8; ++k)
            if (isSafe(M, row + rowNbr[k], col + colNbr[k], visited)){
                DFS(M, row + rowNbr[k], col + colNbr[k], visited);
            }
        return max_1;
    }

    int countIsland(int M[][])
    {
        boolean visited[][] = new boolean[ROW][COL];
        //int count = 0;
        int temp = 0;
        int max =0;
        for (int i = 0; i < ROW; ++i)
            for (int j = 0; j < COL; ++j){
                max_1 = 0;
                if (M[i][j]==1 && !visited[i][j]){
                    temp =  DFS(M, i, j, visited);
                    if(temp>max){
                        max = temp;
                    }
                }
            }
        return max;
    }


    public static void main (String[] args) throws java.lang.Exception
    {
        int M[][]=  new int[][] {{0, 1, 0, 1, 0},
                                 {0, 0, 1, 1, 1},
                                 {1, 0, 1, 1, 0},
                                 {0, 1, 0, 0, 0},
                                 {0, 0, 1, 0, 1}
                                };
     IslandMatrix I = new IslandMatrix();
     System.out.println("Max length of island is: "+ I.countIsland(M));
    }
}

考虑:

 {0, 1, 0, 1, 0}
 {0, 0, 1, 1, 1}
 {1, 0, 1, 1, 0}
 {0, 1, 0, 0, 0}
 {0, 0, 1, 0, 1}

在这种情况下,1的最长岛屿遵循索引路径,如下所示: (0,1) - &GT;(1,2) - &GT;(1,3) - &GT;(0,2) - &GT;(1,4) - &GT;(2,3) - &GT;(2 ,2) - &GT;(3,1) - &GT;(2,0)

以这种方式结果应为9但我得到的结果是10。

任何人都可以用正确的逻辑帮助我。

1 个答案:

答案 0 :(得分:0)

在这种情况下,您使用的是DFS。 它会发现所有连接点不是最长的路径。 结果是10因为我们有一个向后的点(3,1)。 如果您将点(1,0)更改为1,则结果为11。

这是主要问题。解决它代码将起作用。 如果你不能帮助你的话。