【问题标题】:Finding the Diagonal Containing a Specific Cell in a Grid在网格中查找包含特定单元格的对角线
【发布时间】:2011-10-16 06:02:29
【问题描述】:

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

我在 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]

【问题讨论】:

  • 问题描述不清楚,示例代码中有错误,如不明显的未定义变量diagonalposition,以及grid的def没有显示。将示例代码重写为一个包含所有定义的过程,或者作为一个完整的程序,并实际说出“完成工作”的含义。

标签: javascript arrays algorithm


【解决方案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] where i=1, j=1 得到它。

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

4) 要获取对角线 2,获取位置 a[i-1][j+1] 的值,直到达到数组边界和位置 a[i+1][j-1] 的值,直到达到数组边界。

【讨论】:

    【解决方案2】:

    对角线上的单元格的顺序是否重要?如果没有,这个伪代码中的算法就足够了。如果它确实重要,您只需要重新排序一些块并使用循环变量...

    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);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-12-24
      • 1970-01-01
      • 2017-05-04
      • 2022-06-22
      • 2019-03-04
      • 1970-01-01
      • 2015-11-23
      相关资源
      最近更新 更多