在 C/C++ 中旋转后在给定矩阵中的 x,y 处查找元素?
Finding element at x,y in a given matrix after rotation in C/C++?
如何在不执行矩阵旋转的情况下旋转总矩阵后找到给定矩阵中索引 x,y 处的元素。
这意味着我只对那个坐标感兴趣,不想对总矩阵执行总运算,而不仅仅是获取任何索引处的元素。
Example:
suppose a matrix is given
1 2 3
4 5 6
7 8 9
and i want to find the element at 1,1 after rotating the matrix by 90 degree.
answer should be "7".
**NOTE**: Without performing the rotation on total matrix.
and if i want the element at 1,2 than the answer should be "4".
I hope I clearly communicated the question please help if you know the solution or algorithm for this question.
Thank you.
假设你有一个m x n matrix
,你对M[i][j]
旋转后的位置感兴趣。
所以,顺时针旋转90度后,M[i][j] -> M[j][m+1-i].
如您的示例所示,M[3][1] will be M[1][3+1-3] after rotation.
希望这能解决您的问题。
// For 90 degree rotation using correct indexing for x and y (starting at 0 not 1)
// Assuming square matrix
template<class T, int size>
T elemAfter90degRot(int x, int y, T[size][size] mat) {
int j = y;
int i = size - 1 - x;
return mat[i][j];
}
我认为这应该可以解决方阵旋转 90 度的问题
您要映射:
(x,y) -> (x', y')
假设如下:1
x' = ax + by + c
y' = dx + ey + f
现在,(1, 1) 映射到 (W, 1)2
w = a + b + c
1 = d + e + f
(1, W) 映射到 (1, 1)3
1 = a + bw + c
1 = d + ew + f
and (W, H) 映射到 (1, H)4
1 = aw + bh + c
h = dw = eH + f
解2、3、4方程并填入1得到值。 (提示:b = -1,e = 0)
这是解决问题的一种方法(除了使用其他人的解决方案)。
很明显每个元素的列索引是旋转后该元素的行索引(至少,我希望这是清楚的)。
所以,问题是旋转后元素的列索引。
第一行将成为最后一列,第二行将成为倒数第二列,依此类推,直到最后一行成为第一列。
一种查看方式是我们有(行)序列 i = 1, 2, ..., m
并希望将其映射到(列)序列 j = m, m - 1, m - 2, ..., 2, 1
。
但是 m = m + 1 - 1
, m - 1 = m + 1 - 2
, m - 2 = m + 1 - 3
, ..., 1 = m + 1 - m
.
所以所需的序列是 j = m + 1 - i
.
换句话说,M[i][j] -> M[j][m + 1 - i]
.
如何在不执行矩阵旋转的情况下旋转总矩阵后找到给定矩阵中索引 x,y 处的元素。
这意味着我只对那个坐标感兴趣,不想对总矩阵执行总运算,而不仅仅是获取任何索引处的元素。
Example: suppose a matrix is given 1 2 3 4 5 6 7 8 9 and i want to find the element at 1,1 after rotating the matrix by 90 degree. answer should be "7". **NOTE**: Without performing the rotation on total matrix. and if i want the element at 1,2 than the answer should be "4". I hope I clearly communicated the question please help if you know the solution or algorithm for this question. Thank you.
假设你有一个m x n matrix
,你对M[i][j]
旋转后的位置感兴趣。
所以,顺时针旋转90度后,M[i][j] -> M[j][m+1-i].
如您的示例所示,M[3][1] will be M[1][3+1-3] after rotation.
希望这能解决您的问题。
// For 90 degree rotation using correct indexing for x and y (starting at 0 not 1)
// Assuming square matrix
template<class T, int size>
T elemAfter90degRot(int x, int y, T[size][size] mat) {
int j = y;
int i = size - 1 - x;
return mat[i][j];
}
我认为这应该可以解决方阵旋转 90 度的问题
您要映射:
(x,y) -> (x', y')
假设如下:1
x' = ax + by + c
y' = dx + ey + f
现在,(1, 1) 映射到 (W, 1)2
w = a + b + c
1 = d + e + f
(1, W) 映射到 (1, 1)3
1 = a + bw + c
1 = d + ew + f
and (W, H) 映射到 (1, H)4
1 = aw + bh + c
h = dw = eH + f
解2、3、4方程并填入1得到值。 (提示:b = -1,e = 0)
这是解决问题的一种方法(除了使用其他人的解决方案)。
很明显每个元素的列索引是旋转后该元素的行索引(至少,我希望这是清楚的)。
所以,问题是旋转后元素的列索引。
第一行将成为最后一列,第二行将成为倒数第二列,依此类推,直到最后一行成为第一列。
一种查看方式是我们有(行)序列 i = 1, 2, ..., m
并希望将其映射到(列)序列 j = m, m - 1, m - 2, ..., 2, 1
。
但是 m = m + 1 - 1
, m - 1 = m + 1 - 2
, m - 2 = m + 1 - 3
, ..., 1 = m + 1 - m
.
所以所需的序列是 j = m + 1 - i
.
换句话说,M[i][j] -> M[j][m + 1 - i]
.