假设我有10x10矩阵,其中包含以下数据:
我的位置在[4][4]
。我怎么才能列出这个位置的对角线数值呢?
例如,预期结果将是:
[56, 67, 78, 89, 100, 1, 12, 23, 34]
[54, 63, 72, 81, 9, 18, 27, 36]
我目前的解决方案
def next?(index, row, size)
(((row + index) % size) + 1 ) % size
end
(1...chess_size).each do |l|
next_el, curr_el = next?(l, row, chess_size), (row + l) % chess_size
# this gets me the first diagnonal. Note that it prints out wrong value
tmp[0] << chess[curr_el][curr_el]
# this gets me the values from current row below to up
tmp[1] << chess[(row + l) % chess_size][row]
tmp[2] << chess[-l][l]
tmp[3] << chess[row][(row + l) % chess_size]
end
我们的矩阵将始终具有相同的行数和列数。
7条答案
按热度按时间xpcnnkqh1#
通常,要从
i
和j
获得对角线值,可以同时迭代i
和j
,直到其中一个为零。因此,主对角线是(i-1, j-1), (i-2, j-2), ...
到i, j >= 0
,(i + 1, j + 1), (i +2, j + 2), ...
到i, j <= n
。对角线是(i - 1, j + 1), (i - 2, j + 2), ...
到i >= 0
和j <= n
,(i + 1, j-1), (i + 2, j - 2), ...
到i <= n
和j >= 0
。pu82cl6c2#
这是HackerRank Queen's attack问题的解决方案。
代码
示例
假设棋盘有
9
行和列,女王的位置用字符q
表示,每个障碍用字母o
表示。所有其他位置由字母x
表示。我们看到女王有16
可能的移动(7
上和下,6
左右,1
在上-左到下-右对角线上,2
在上-右-下-左对角线上。说明
l
是女王排中障碍物的最大列索引,小于女王的列索引;r
是大于女王列索引的女王障碍物的较小列索引;u
是女王栏中障碍物的最大行索引,小于女王行索引;d
是女王列中大于女王行索引的障碍物的最小行索引;ul
是女王左上角至右下角对角线上的障碍物的最大行索引数,小于女王的行索引数;dr
是女王左上角至右下角对角线上的障碍物的最小行索引,大于女王行索引;ur
是女王右上角至左下角对角线上的障碍物的最大行索引,小于女王行索引;以及dl
是女王从右上角到左下角对角线上的障碍物的最小行索引,它大于女王的行索引。对于上例,在考虑障碍物之前,将这些变量设置为下列值。
注意,如果女王具有行和列索引
qrow
和qcol
,i - j = qrow - qcol
在女王的左上角至右下角的对角线上;以及i + j = grow + gcol
用于所有位置[i, j]
,在女王的右上角到左下角对角线上然后,我们遍历所有(唯一的)障碍,为每个障碍确定它是在女王的行、女王的列中,还是在女王的一条对角线中,如果它比以前最接近的位置“更接近”女王,则用它的行或列索引替换适用变量的值。
例如,如果障碍物位于女王的行且其列索引
j
小于女王的列索引,则进行以下计算:同样,如果障碍物位于女王的左上角到右下角的对角线上,并且其行索引
i
小于女王的行索引,则计算将为:在考虑了上例中的所有障碍之后,变量具有下列值。
最后,我们计算女王可以移动到的方格总数。
这就简化为
qrjkbowd3#
我应用了@OMG提供的逻辑。不确定它的效率会有多高。
uqzxnwby4#
@CarySwoveland看起来@Jamy正在处理HackerRank
queens-attack
的另一个问题。这个问题相当困难,因为这个想法是从一开始就永远不会创建矩阵。也就是说,测试用例变得非常大,因此空间复杂性将是一个问题。
我已经更改了我的实现,但仍然因为超时问题而失败(这是因为测试用例变得非常大)。我不确定如何才能让它具有表现力。
在我展示密码之前。让我用插图来解释我想要做的事情:
这是我们的国际象棋:
这就是我们的女王所在的地方:
queen[2][3]
女王可以攻击所有8个方向。即:
因为在这8条路径内没有障碍,女王总共可以攻击14次攻击。
假设我们遇到了一些障碍:
现在女王总共可以攻击7次攻击:
[13, 18, 19, 15, 10, 9, 4]
代码
问题
现在的问题是,我不知道为什么我的代码会从HackerRank中执行超时错误。我知道这一点是因为测试用例,其中国际象棋的维度可以是10,000×10,000。但我不知道我错过了什么约束。
xj3cbfub5#
我刚刚从OP发布的一条评论中了解到,我解决了错误的问题,尽管OP的问题似乎很清楚,特别是这个例子,并且与我的解释一致。我将把这个解决方案留给以下问题:“给定一个数组
arr
使得Matrix(*arr)
是一个NxM矩阵,以及一个矩阵位置i,j
,返回一个数组[d,a]
,其中元素d
和a
是通过[d,a]
但不包括[d,a]
的对角线上的元素,并且每个元素都被旋转,使得第一个元素的行索引在i < arr.size-1
时是i+1
,否则是0
。代码
数组
arr
的所有元素的大小必须相等,但不要求arr.size = arr.first.size
。示例
说明
假设
具体步骤如下。
选择通过
[row_idx, col_idx]
的左上角到右下角对角线上的位置[r, c]
并对其进行排序。选择通过
[row_idx, col_idx]
的左下角对角线上的位置[r, c]
并对其进行排序。yvt65v4c6#
我刚刚从OP发布的一条评论中了解到,我解决了错误的问题,尽管OP的问题似乎很清楚,特别是这个例子,并且与我的解释一致。我将把这个解决方案留给以下问题:“给定一个数组
arr
使得Matrix(*arr)
是一个NxM矩阵,以及一个矩阵位置i,j
,返回一个数组[d,a]
,其中元素d
和a
是通过[d,a]
但不包括[d,a]
的对角线上的元素,并且每个元素都被旋转,使得第一个元素的行索引在i < arr.size-1
时是i+1
,否则是0
。以下方法使用Matrix类中的方法。
代码
示例
说明
假设阵列和目标位置如下所示。
注
arr[2][3] #=> 16
。我们通过计算两个矩阵的子式的对角线来得到负斜率的对角线:和
给了我们
为了获得另一条对角线,我们将阵列逆时针旋转90度,调整
row_idx
和col_idx
,并重复上述过程。现在我们从矩阵子式中提取对角线
和
要获得第二条对角线,请执行以下操作:
lmyy7pcs7#
在结尾处,女王所在的位置会有一个‘Q’,在Q不能移动的位置有‘0’和‘’。她可以移动的地方