我无法弄清楚如何处理以下情况:我有一个9*9
矩阵和矩阵的给定元素。我想知道元素是否是具有相同值的元素形成的对角线(给定大小)的一部分。
例如:如果我的元素位于[7][5]
,其关联值为1
,元素的值位于[8][4]
,[6][6]
,{{1 },[5][7]
也有值[4][8]
,而不是意味着1
是包含5个元素的对角线的一部分。
我需要这个算法来实现Java中的Lines游戏。你能帮我解决这个问题的正确方法吗?谢谢
答案 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