2009-08-11 96 views
2

这不是一项家庭作业。我是编程初学者,这也是我的第一篇文章 - 请耐心等待。查找矩阵中相邻数字的最大面积

我无法找到这里发布的类似问题。

在初学者的书,我发现了以下问题:

# Find the biggest area of adjacent numbers in this 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实现从http://www.algolist.net/Algorithms/Graph_algorithms/Undirected/Depth-first_search。有“幻数”无处不在,这些方法是“公共静态”等等 - 我正打算工作的算法后,以修复这些东西......

public class AdjacentAreaInMatrix { 
    /* 
    * Enums for the state of the Nodes, for use in DFS/BFS 
    */ 
    private enum NodeState { 
     Visited, InProgress, Unvisited 
    }; 

    /* 
    * These 2 'magic' numbers come from the hardcoded 'matrix' below, 
    * cause it has 5 rows and 6 columns 
    */ 
    public static final int ROWSCOUNT = 5; 
    public static final int COLUMNSCOUNT = 6; 

    /* 
    * Two variables for counting the maximum sequence 
    * of numbers (as required by the problem definition) 
    */ 
    private static int tempElementsCount = 0; 
    private static int maxElementsCount = 1; // except if the matrix is empty, then it should be 0 

    /* 
    * The hardcoded matrix 
    */ 
    private static final int[][] matrix = new int[][] { 
      { 1, 3, 2, 2, 2, 4 }, 
      { 3, 3, 3, 2, 4, 4 }, 
      { 4, 3, 1, 2, 3, 3 }, 
      { 4, 3, 1, 3, 3, 1 }, 
      { 4, 3, 3, 3, 1, 1 } }; 

    /* 
    * Create an auxiliary matrix 'state' to implement DFS. 
    * Initialize the whole matrix as 'unvisited' and 
    * start DFS at the first element of the matrix 
    */ 
    public static void DFS() { 
     NodeState state[][] = new NodeState[ROWSCOUNT][COLUMNSCOUNT]; 
     // clear the state of the matrix 
     for (int i = 0; i LT ROWSCOUNT; i++) { 
      for (int j = 0; j LT COLUMNSCOUNT; j++) { 
       state[i][j] = NodeState.Unvisited; 
      } 
     } 
     runDFS(0, 0, state);  
    } 

    /* 
    * Using the auxiliary matrix "state[][]", use DFS to traverse the 
    * 'real' matrix[][] 
    */ 
    public static void runDFS(int i, int j, NodeState state[][]) { 
     state[i][j] = NodeState.InProgress; 
     // traverse the whole matrix state[][] and recursively run runDFS() from the needed elements. 
     for (int rows = 0; rows LT ROWSCOUNT; rows++) { 
      for (int columns = 0; columns LT COLUMNSCOUNT; columns++) { 
       /* 
       * ---------------------------------------------------------------------- 
       * For the logic in the 'if' statement regarding the adjacent elements: 
       * i0j0 i1j0 i1j0 
       * i0j1 i1j1 i2j1 
       * i0j2 i1j2 i2j2 
       * It uses the thing, that the sum of (i+j) for the coordinates of 
       * the elements above, below, on the left and on the right of i1j1 
       * are exactly +1/-1 of the sum of the coordinates of i1j1 
       * -> i1j2 to 1+2 = 3 
       * -> i2j1 to 1+2 = 3 
       * -> i1j1 to 1+1 = 2 (the current element) -> matrix[i][j] 
       * -> i1j0 to 1+0 = 1 
       * -> i0j1 to 1+0 = 1 
       * ---------------------------------------------------------------------- 
       */ 
       if ((matrix[i][j] == matrix[rows][columns]) // if the values are equal 
         && ((((i+j) - (rows + columns)) == 1) || (((i+j) - (rows + columns)) == -1))// and if the element is adjacent 
         && (state[rows][columns] == NodeState.Unvisited)) { // and if the element is still not visited 
        tempElementsCount++; 
        if (tempElementsCount > maxElementsCount) { 
         maxElementsCount = tempElementsCount; 
        } 
        runDFS(rows, columns, state); // recursively run DFS for each element, that "isEdge" 
       } else { 
        // if the elements aren't [adjacent, equal and not visited], start the count again from '0' 
        tempElementsCount = 0; 
       } 
      } 
     } 
     state[i][j] = NodeState.Visited; 
    } 

    public static void go() { 
     AdjacentAreaInMatrix.DFS(); 
     System.out.println(maxElementsCount); 
    } 
} 

调试了好几天之后,每调试会话代码变得更加复杂...任何帮助将不胜感激。提前致谢。

+0

嗯......你的问题到底是什么?你是否想要关于算法的建议,帮助解决特定的错误,或者对代码设计的评论? – 2009-08-11 15:01:55

+0

关于算法的建议很好,谢谢。我非常清楚,代码设计不好(我甚至没有试图在算法运行前做好它)。但是,上面显示的代码总是给我'1',不管从哪个矩阵开始 - 我喜欢在这里问这里,而不是再次调试它。 – 2009-08-11 15:04:18

+0

另外,在我发现的所有书籍/文章中,DFS/BFS的矩阵由1/0表示有/无边缘。我不确定我是否正在使用此矩阵的正确数据表示(我以前没有写过DFS)。 – 2009-08-11 15:12:11

回答

2

我认为问题在于您每次都重置tempElementsCount。试想一下你的代码如何在给定的矩阵上工作,你会发现你在runDFS()方法中总是用元素(0,0)开始搜索,if元素将是false,所以你重置之前tempElementsCount您可以继续使用其他(也可能是相邻的)元素进行搜索。希望我已经清楚了......

+0

谢谢,你是对的。从(1,1)开始而不重置tempElemetsCount得到12,这足够清晰以便使算法正常工作。非常感谢! – 2009-08-11 15:22:11

+0

对不起,但我不能投这个答案,因为我没有足够的声誉做这件事。再次感谢您的帮助。 – 2009-08-11 15:34:35