假设我们有一个包含单元格的网格,并且我们想要返回两个数组,其中每个数组都包含对角线中与该单元格相对应的所有单元格,左上角到右下角和相反的单元格。最好的方法是什么?
我在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]
答案 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);
}