算法 - 确定在矩阵中是否存在具有相同值的特定大小的对角线

时间:2011-11-13 22:40:59

标签: java algorithm math matrix

我无法弄清楚如何处理以下情况:我有一个9*9矩阵和矩阵的给定元素。我想知道元素是否是具有相同值的元素形成的对角线(给定大小)的一部分。

例如:如果我的元素位于[7][5],其关联值为1,元素的值位于[8][4][6][6],{{1 },[5][7]也有值[4][8],而不是意味着1是包含5个元素的对角线的一部分。

我需要这个算法来实现Java中的Lines游戏。你能帮我解决这个问题的正确方法吗?谢谢

2 个答案:

答案 0 :(得分:1)

如果你在[x] [y]位置(在你的例子中x = 7,y = 5),那么你想要检查四个方向,直到它们停止在[x] [y]处取值。然后取最大值。

int t[][]; //that's the matrix
int[] dx = new int[] { 1, -1, 1, -1 };
int[] dy = new int[] { -1, 1, 1, -1 };

static boolean checkBoundaries(int x, int y) {
    return x >= 0 && x <= t.length && y >= 0 && y <= t[0].length
}

static int CountInDirection (int x, int y, int dir){
    int ret = 0;
    int val = t[x][y];
    x+=dx[dir];
    y+=dy[dir];
    while(chechBoundaries(x,y) && t[x][y] == val)
        ++ret;

    return ret;
}

static void main(String[] args){
    int diag1 = CountInDirection (7,5,0) + CountInDirection (7,5,1);
    int diag2 = CountInDirection (7,5,2) + CountInDirection (7,5,3);
    System.out.println("Max diag is: " + Math.max(diag1, diag2));
}

答案 1 :(得分:1)

首先,让我们观察它可以是两个对角线。 最简单的解决方案是向四个可能的方向扩展,直到价值 是不同的或我们击中矩阵的边界。如果我们在边境完成 在两个端点中,这意味着它属于对角线。 伪代码可以如下

boolean expands(x, y, dir_x, dir_y, matrix):
  x1 = x
  y1 = y
  while positionInBorder(x1, y1):
    if matrix[x][y] != matrix[x1][y1]:
      return false
    x1 += dir_x
    y1 += dir_y      
  return true

boolean inDiagonal(x, y, matrix):
   return (expands(x, y, -1, -1, matrix) and expands(x, y, +1, +1, matrix)) or
          (expands(x, y, +1, -1, matrix) and expands(x, y, -1, +1, matrix))

如果你需要计算所有这些点,这是相当的 自然记住游戏上下文,你可以使用更有效的算法。 您检查所有可能的对角线,如果它们具有相同的值, 为其中的所有元素设置标志:

isInDiagonal[n][n] = False for all i, j.
for start_position in top_row and left_column of matrix:
   go down right while same value:
      if reached bondary:
        pass again and set isInDiagonal[x][y] for each item in diagonal
for start_position in top_row and right_column of matrix:
   go down left while same value:
      if reached bondary:
        pass again and set isInDiagonal[x][y] for each item in diagonal

return isInDiagonal