我遵循5x5矩阵:
11 21 31 41 51
12 22 32 42 52
13 23 33 43 53
14 24 34 44 54
15 25 35 45 55
现在我想反映该矩阵并获得以下结果:
55 54 53 52 51
45 44 43 42 41
35 34 33 32 31
25 24 23 22 21
15 14 13 12 11
原始矩阵由 2D阵列矩阵[row] [column] 表示。所以我们的想法是交换价值。
我的策略是:
(1,1) with (5,5)
(1,2) with (4,5)
(1,3) with (3,5)
(1,4) with (2,5)
and
(2,1) with (5,4)
(2,2) with (4,4)
(2,3) with (3,4)
(2,4) with (2,4)
...
这是我的代码:
for(int i = 0; i < 5; i++){
for(int k = 0; k < 4; k++){
int f = matrix[i][k];
int s = matrix[4-k][4-i];
matrix[i][k] = s;
matrix[4-k][4-i] = f;
}
}
代码不起作用。有什么想法吗?
答案 0 :(得分:4)
您正在交换元素两次。您只需要交换上部(或下部)对角线元素。你可以这样做:
int size = arr.length;
for(int i=0;i<size;i++){
for(int j=0;j<size-i;j++){
int tmp = arr[i][j];
arr[i][j] = arr[size-j-1][size-i-1];
arr[size-j-1][size-i-1] = tmp;
}
}
答案 1 :(得分:1)
您可以使用相同矩阵的副本,以便能够将值存储在新的matrix2中。
(martix != matrix2)
是真的
现在我使用此代码来反转矩阵:
for(int i=0; i<5; i++) {
for(int j=0; j<5; j++) {
matrix[i][j] = matrix2[4-j][4-i];
}
}
答案 2 :(得分:1)
我决定将此视为foreach循环,因此我执行了以下操作:
int bound = matrix.size - 1;
for (int[] row : matrix) {
for (int theint : row) {
//get current position; price of foreach
cury = matrix.indexOf(row);
curx = row.indexOf(theint);
//verify that we're above swap line
if (cury + curx < bound) {
//calculate reflected position
def newx = bound - curx;
def newy = bound - cury;
//do swap
def tmp = matrix[newx][newy];
matrix[newx][newy] = matrix[cury][curx];
matrix[cury][curx] = tmp;
}
}
}
不知道为什么,但我觉得它比使用i,j,k等更清晰......我相信@ codaddict的回答是有效的。