计算元素在2D数组的给定列中出现的次数?

时间:2014-04-21 12:54:10

标签: java arrays

这是一个数独游戏的方法。

有人可以为此解释他们的思维过程吗? :(我在解决这个问题上遇到了很多困难。我知道第一种方法,我们应该使用for循环或其他东西。 我知道我的方法迭代错了...抱歉:(

 private int countOccurrencesInCol(int col, int d){
   for (int i = 0; i < grid.length; i++;){
     for(int j = col; j = col; j++;){
        if (grid[i][j] == d){
          count++;
        }
      }
    }
   return count;
 }

此方法返回数字在9 X 9矩阵中的给定列中出现的次数。

    private int countPossiblePlacementsInCol (int col, int d){

该方法应该确定给定列中可以放置给定数字的点的数量,并返回可以将数字放置在给定列的点中的点的数量。如果已经出现数字,则该方法返回0.

2 个答案:

答案 0 :(得分:3)

以下是一些带有解释的代码,可帮助您了解所需的方法:

private int countOccurrencesInCol(int col, int d) {
    // counter variable to count the number of occurrences
    int counter = 0;
    // matrix is the 2D array, the first index is the row, second is the column
    // loop through each index of the given column, checking for the digit, d
    for(int row = 0; row < matrix.length; row++) {
        // if a match is found...
        if(matrix[row][col] == d) {
            // increment the counter by one
            counter++;
        }
    }

    // return the final count
    return counter;
}

下一个方法有点棘手,因为我不清楚需要什么。这个方法应该只返回给定列中的空单元格数吗?或者它应该考虑到数独的所有规则并检查那些空单元格是否是该数字的有效移动?如果是前者,那么解决方案很简单:

private int countPossiblePlacementsInCol(int col, int d) {
    // I am assuming an empty cell is indicated by 0. In that case,
    // we can reuse the previous method to find the number of occurrences of d,
    // and the occurences of 0

    // first, find out if the digit already occurs in the row, return 0
    // if it does:
    if(countOccurrencesInCol(col, d) > 0) {
        return 0;
    }

    // next, return the number of times 0 occurs (the number of empty cells):
    return countOccurrencesInCol(col, 0);
}

但是,如果你只计算VALID移动,这会变得更加棘手。上一个方法的最后一行会变成更像这样的东西:

private int countPossiblePlacementsInCol(int col, int d) {
    //start the same as the previous method:
    if(countOccurrencesInCol(col, d) > 0) {
        return 0;
    }

    int counter = 0;
    // this time, for each cell in the column, you must check that it is a valid move:
    for(int row = 0; row < matrix.length; row++) {
        if(countOccurrencesInRow(row, d) == 0 &&
           countOccurencesInSquare(row, col, d) == 0) {
            counter++
        }
    }
}

这次我使用的两种方法countOccurrencesInRowcountOccurencesInSquare将会执行与countOccurrencesInCol类似的操作。 Row基本上与Col基本相同,但它检查行而不是列。 Square一个有点棘手。假设您了解数独游戏的规则,您应该知道正方形是9x9游戏板的3x3部分(其中有9个3x3部分)。 Square方法将使用row和col来确定给定单元格所在的方块,然后循环遍历该方块的行和列,计算给定数字的出现次数。为此,您需要使用两个for循环,一个嵌套在另一个循环中。如果您无法理解如何正确使用for循环并循环遍历数组,那么我建议您与您的老师/教授联系以获取有关该主题的其他帮助。

我希望这些解释和例子有所帮助。祝你好运。

答案 1 :(得分:2)

你不需要第二个for循环。

列中数字的出现次数可以通过

找到
private int countOccurrencesInCol(int col, int d){
       for (int i = 0; i < grid.length; i++){
            if (grid[i][col] == d){
              count++;
            }
          }
       return count;
     }

希望这有帮助!

祝你好运!