您好我正在尝试执行一个代码,该代码以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。
任何人都可以用正确的逻辑帮助我。
答案 0 :(得分:0)
在这种情况下,您使用的是DFS。 它会发现所有连接点不是最长的路径。 结果是10因为我们有一个向后的点(3,1)。 如果您将点(1,0)更改为1,则结果为11。
这是主要问题。解决它代码将起作用。 如果你不能帮助你的话。