java - 使用DFS算法查找矩阵中相邻数字的最大面积

标签 java algorithm matrix

我正在通过一本面向初学者的书自学编程。我在 Arrays 章节之后的最后一个任务是:

 // Find the biggest area of adjacent numbers in this matrix:
int[][] matrix = {
        {1,3,2,2,2,4},
        {3,3,3,2,4,4},
        {4,3,1,2,3,3}, // --->13 times '3';
        {4,3,1,3,3,1},
        {4,3,3,3,1,1}

作为提示,我有 - 使用 DFS 或 BFS 算法。在我阅读了它们并看到了它们的许多实现之后,我有了这个想法,但是对于初学者来说这太过分了。我找到了我的任务的解决方案,在多次运行该程序后,我明白了它是如何工作的,现在我可以自己解决问题了。虽然,我很高兴这个解决方案帮助我了解了递归,但我想知道是否可以以迭代方式修改以下代码,如果可以,你能给我提示如何去做吗?提前谢谢你。

public class Practice {

private static boolean[][] visited = new boolean[6][6];
private static int[] dx = {-1,1,0,0};
private static int[] dy = {0,0,-1,1};
private static int newX;
private static int newY;

public static void main(String[] args){
 // Find the biggest area of adjacent numbers in this matrix:
 int[][] matrix = {
        {1,3,2,2,2,4},
        {3,3,3,2,4,4},
        {4,3,1,2,3,3}, // --->13 times '3';
        {4,3,1,3,3,1},
        {4,3,3,3,1,1}

};

int current = 0;
int max = 0;

for (int rows = 0; rows < matrix.length;rows++){
    for(int cols = 0; cols < matrix[rows].length;cols++){

        if (visited[rows][cols] == false){
            System.out.printf("Visited[%b] [%d] [%d] %n", visited[rows]
       [cols],rows,cols);
            current = dfs(matrix,rows,cols,matrix[rows][cols]);
            System.out.printf("Current is [%d] %n", current);
            if(current > max){
                System.out.printf("Max is : %d %n ", current);
                max = current;
            }

        }
    }   
}       
        System.out.println(max);
}
static int dfs(int[][] matrix,int x, int y, int value){         

    if(visited[x][y]){
        System.out.printf("Visited[%d][%d] [%b] %n",x,y,visited[x][y]);
        return 0;
    } else {
        visited[x][y] = true;
        int best = 0;
        int bestX = x;
        int bestY = y;

        for(int i = 0; i < 4;i++){
             //dx = {-1,1,0,0};
             //dy = {0,0,-1,1};
            int modx = dx[i] + x;
            System.out.printf(" modx is : %d %n", modx);
            int mody = dy[i] + y;
            System.out.printf(" mody is : %d %n", mody);
            if( modx == -1 || modx >= matrix.length || mody == -1 || mody >= 
             matrix[0].length){
                continue;
            }
            if(matrix[modx][mody] == value){
                System.out.printf("Value is : %d %n",value);
                int v = dfs(matrix,modx,mody,value);
                System.out.printf(" v is : %d %n",v);
                best += v;
                System.out.printf("best is %d %n",best);
            }

            newX = bestX;
            System.out.printf("newX is : %d %n",newX);
            newY = bestY;
            System.out.printf("newY is : %d %n",newY);
        }
        System.out.printf("Best + 1 is  : %d %n ",best + 1);
            return best + 1;
    }


}
}

最佳答案

如果您在维基百科页面上查找 Depth-first search在伪代码部分,他们有一个 DFS 算法迭代版本的例子。应该能够从那里找出解决方案。

*编辑

要使其迭代,您可以执行以下操作:

procedure DFS-iterative(matrix, x, y):
  let S be a stack
  let value = 0
  if !visited[v.x, v.y]
    S.push(position(x,y))
  while S is not empty
    Position v = S.pop()
    value += 1
    for all valid positions newPosition around v 
      S.push(newPosition)
  return value

每次你调用dfs()递归方法中的方法,你应该调用 S.push() .您可以按如下方式创建类 Position

class Position{
  int x;
  int y;
  public Position(int x, int y){
    this.x = x;
    this.y = y;
  }
  //getters and setters omitted for brevity
}

并使用内置的java类java.util.Stack让它变得简单。

Stack<Position> s = new Stack<Position>();

如果您想使用 BFS 而不是 DFS,您可以简单地将 Stack 更改为 Queue,您将获得所需的结果。 This link对堆栈和队列有很好的解释,在您了解该主题时可能会很有用。

关于java - 使用DFS算法查找矩阵中相邻数字的最大面积,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44888228/

相关文章:

java - 排序文件 'numerically' 而不是在 java 中按字母顺序排列

java - 在 JUnit 测试用例中触发 Spring 批处理作业

java - 图像文件处理性能中的 SWT 与 AWT?

python - 设计一个should_throttle函数,根据一定的时间窗口限制请求

opencv - 单应矩阵分解为旋转矩阵和平移向量

algorithm - 在矩阵中找到最大可访问节点

java - 过滤掉带有字符串字符的ip地址日志文件

algorithm - 计算DFS算法的时间复杂度

arrays - 任意长度的两个非重叠子数组的最大和

c++ - 导致崩溃的矩阵