查找包含网格中特定单元格的对角线

时间:2011-10-16 06:02:29

标签: javascript arrays algorithm

假设我们有一个包含单元格的网格,并且我们想要返回两个数组,其中每个数组都包含对角线中与该单元格相对应的所有单元格,左上角到右下角和相反的单元格。最好的方法是什么?

我在javascript中尝试了以下内容(请注意board是一个一维数组,应该表示边长为boardSize的方形网格。position是我所在的单元格试图找到它的对角线。)

    var diagonal1 = [];
    var diagonal2 = [];
    for(var i = 0; i < board.length; i++) { 
        if (i == position) diagonal.move_index = diagonal.length
        if (Math.abs(position - i) % (boardSize + 1) == 0) {
            diagonal1.push(board[i]);
        }
        else if (Math.abs(position - i) % (boardSize - 1) == 0) { 
            diagonal2.push(board[i]);
        }
    }

但这只是针对位于主对角线的元素而不是其他元素。有什么想法吗?

示例:

if board = [1,2,3,4,5,6,7,8]
board:
        1 2 3 
        4 5 6 
        7 8 9 
then If I say that I want to find the diagonals for position = 4 
I should get:
diagonal1 = [4, 8] 
diagonal2 = [2, 4] 

and if I choose another position, lets say position = 5, then:
diagonal1 = [1, 3, 5] 
diagonal2 = [3, 5, 7]

2 个答案:

答案 0 :(得分:1)

自己编码:

想法:

1)将电路板实现为二维阵列。

(数组a [3] [3]的例子,以数组索引给出)

00 01 02 03
10 11 12 13
20 21 22 23
30 31 32 33

2)找到数组中元素的位置。比如说在位置a [1] [1],当我们在程序中找到它时,我们用[i] [j]得到它,其中i = 1,j = 1。

3)要获得diagonal1,获取位置a [i-1] [j-1]的值,直到i = 0且j = 0。 AND位置a [i + 1] [j + 1]的值,直到达到数组边界,在本例中为3。

4)获得diagonal2获取位置a [i-1] [j + 1]的值,直到到达位置a [i + 1] [j-1]的数组边界AND值,直到达到数组边界。

答案 1 :(得分:0)

对角线中细胞的顺序是否重要?如果不是,则该伪代码中的算法应该足够。如果它确实重要,你只需要重新排序一些块并使用循环变量......

getDiagonals(x, y) {

    Set<Cell> diagonal1;
    Set<Cell> diagonal2;

    diagonal1.add(board[x][y]); //manually add center cell to both diagonals
    diagonal2.add(board[x][y]);

    //Sweep forwards, adding higher cells to diag1 and lower cells to diag2
    for(int i=1; x+i < board.size(); i++) { //board.size() for 'horizontal' size
        if(y-i >= 0) diagonal1.add(board[x+i][y-i]);
        if(y+i < board[0].size()) diagonal2.add(board[x+i][y+i]); //board[0].size for 'vertical' size
    }

    //Sweep backwards, adding higher cells to diag2 and lower cells to diag1
    for(int i=1; x-i >= 0; i++) {
        if(y-i >= 0) diagonal2.add(board[x-i][y-i]);
        if(y+i < board[0].size()) diagonal1.add(board[x-i][y+i]);
    }

    return (diagonal1, diagonal2);
}