如何检测数组中的相邻条目?

时间:2012-10-15 01:02:59

标签: java arrays

“在Java中编写一个方法,如果在方格板(二维数组)的同一行,列或对角线中存在k个相邻符号,则返回true,其中k是内联所需符号的数量。“

我该怎么做?我对如何检查行和列有一个粗略的想法(非常粗糙;没有代码,只是想法),但我无法检查对角线。

编辑:我正在考虑的另一种情况:我如何检查任意位置?现在,我只考虑从(0,0)开始的事件,但如果从(2,3)到(2,6)有一个3的字符串怎么办?我怎样才能跟踪多次出现?

编辑:检测左对角线(我在下面评论中发布的问题的粗略代码):

LeftDiagonal(x, symbol) {
    noOfOccurence = 0;

    for (currentX = (size - 1); currentX >= x; currentX--) {
        if (board[currentX][currentX] == symbol) {
            noOfOccurence++;
        } else {
            break;
        }
    }

    return (noOfOccurence >= k);
}

4 个答案:

答案 0 :(得分:1)

最简单的(虽然不是最有效的,因为它可能会回溯)解决方案是想写一个递归函数,如下面的psuedocode

 FindAdjacent(x, y)
       if (matrix[x-1][y-1] == matrix[x][y])
            return 1 + FindAdjacent(x-1,y-1);
       .. Repeat for all 7 other adjacent locations (-1, +0) (+0, -1) (+1, -1) (-1, +1) (+1, +1) (+1, 0) (0, +1)
       else return 1;

给定坐标x,y,该例程将在'blob'中返回其周围的符号。
注意:这也意味着对符号进行分组,例如连续3个符号,下面的列旁边有1个符号。

如果您要对矩阵中的每个位置调用一次,并查看一旦所有递归级别返回的返回值是>= k,这可能会解决您的问题。记得要做边界检查,这样就不会检查矩阵[-1] [ - 1]或其他任何内容。

答案 1 :(得分:0)

你将会运行很多我想象的嵌套循环。不要忘记所有的对角线。

array[1][1] is just below array[0][1] above array[2][1] to the left of array[1][2] to the right of array[1][0] and diagonal to four different points:

diagonal up and to the left is array[0][0]
diagonal up and to the right is array[0][2]
down and to the left is array [2][0]
down and to the right is array[2][2]

[0][0] | [0][1] | [0][2]
[1][0] | [1][1] | [1][2]
[2][0] | [2][1] | [2][2]

如果你想了很多,我认为数组[x] [y]会产生误导。 array [row] [column]更好。

答案 2 :(得分:0)

首先,不要相信你的“思想”。编写实际代码以确保您可以对行和列进行检查。

这个想法应该是直截了当的:

循环通过棋盘。假设左上角是[0,0],然后右转([0,1],[0,2] ...),直到你到达右边界。然后转到下一行。完成,直到你碰到右下方框。

对于每个方框,检查是否有k出现在右边,2。向下,3。对角线到左下方,4。对角线到右下方。

如果4中的任何一个发生,则返回true,否则,移至下一个单元格。

例如,这里有一些psuedocode示例:

通过董事会迭代:

ROWS=8;
COLS=8;
char[ROWS][COLS] board;
k = 3; // occurrence

for (x = 0 to COLS-1) {
  for (y = 0 to ROWS-1) {
    checkRightward(x, y, k);
    // checkDownward(...)
  }
}

示例checkRightward:

checkRightward(x,y,k) {
  char symbol = board[y][x];
  noOfOccurence = 0;
  for (currentX = x; currentX  < COLS ; ++currentX) {
    if (board[y][currentX] == symbol) {
      noOfOccurence++;
    } else {
      break; // jump out from the loop
    }
  }

  return (noOfOccurence >= k);
}

您应该很难将这个想法转换为Java,并添加其他缺少的检查。


编辑:由于作者似乎并不真正理解我在说什么......所以我对这个想法进行了一些视觉展示:

假设一块8 x 8的板,就像这样:

           X
     0 1 2 3 4 5 6 7
  0
  1
  2
  3        * ---->
Y 4      / | \
  5   |/_  |  _\|
  6        V     
  7

在上图中,当前单元格的[x,y]坐标(带星号*的位置)为[3,3]。你要做的就是检查

1)向右: 这意味着检查[3,3],[4,3],[5,3] ....是否具有相同的符号

2)向下: 这意味着检查[3,3],[3,4],[3,5] ....是否具有相同的符号

3)右对角线: 这意味着检查[3,3],[4,4],[5,5] ....是否具有相同的符号

4)左对角线: 这意味着检查[3,3],[2,4],[1,5] ....是否具有相同的符号

从[0,0]单元格开始检查,然后[1,0],[2,0] ...然后[0,1],[1,1] [2,1]。 ..直到你发现4个检查中的任何一个成功的细胞,或者当你击中最后一个细胞时([7,7])。

答案 3 :(得分:0)

for(i=0;i<row;i++)
For(j=0;j<column;j++){
current = Arr[row][col];
For(count=0;count<k;count++)
{
If(current==arr[row][col+count])
Flagcol=true
Else
Flagcol=false
}
For(count=0;count<k;count++)
{
If(current==arr[row+count][col])
Flagrow=true
else
Flagrow=false
}
For(count=0;count<k;count++)
{
If(current==arr[row+count][col+count])
Flagdiagnoltrue
Else 
Flagdiagnol=false
}
}
}

一个非常粗略的草案来提供想法..并记住一件事,你需要检查行+计数/ col +计数是否不应超过行/计数..这些outofbondsexception ..: - D