如何旋转2d数组90º 逆时针方向?

w1jd8yoj  于 2021-06-30  发布在  Java
关注(0)|答案(2)|浏览(378)

我需要把一个给定的矩阵旋转90度º 逆时针方向,我不知道怎么开始。
例如:
从这个开始

  1. 5 10 8 9
  2. 16 30 25 41
  3. 7 17 50 12
  4. 45 8 22 34

对此:

  1. 9 41 12 34
  2. 8 25 50 22
  3. 10 30 17 8
  4. 5 16 7 45
gajydyqb

gajydyqb1#

这就像矩阵转置。可以在循环中使用循环,也可以在流中使用流:

  1. int d = 4;
  2. int[][] arr1 = {
  3. {5, 10, 8, 9},
  4. {16, 30, 25, 41},
  5. {7, 17, 50, 12},
  6. {45, 8, 22, 34}
  7. };
  1. int[][] arr2 = new int[d][d];
  2. int[][] arr3 = new int[d][d];
  3. int[][] arr4 = new int[d][d];
  1. IntStream.range(0, d).forEach(i ->
  2. IntStream.range(0, d).forEach(j -> {
  3. // matrix transpose
  4. arr2[j][i] = arr1[i][j];
  5. // turn matrix 90º clockwise
  6. arr3[j][d - 1 - i] = arr1[i][j];
  7. // turn matrix 90º counterclockwise
  8. arr4[d - 1 - j][i] = arr1[i][j];
  9. }));
  1. Arrays.stream(arr4).map(Arrays::toString).forEach(System.out::println);
  2. // [9, 41, 12, 34]
  3. // [8, 25, 50, 22]
  4. // [10, 30, 17, 8]
  5. // [5, 16, 7, 45]
展开查看全部
rbl8hiat

rbl8hiat2#

每个细胞 [i][j] 原来的矩阵变成了一个细胞 [4-1-j][i] 在旋转矩阵中:

  1. int d = 4;
  2. int[][] arr1 = {
  3. {5, 10, 8, 9},
  4. {16, 30, 25, 41},
  5. {7, 17, 50, 12},
  6. {45, 8, 22, 34}};
  7. int[][] arr2 = new int[d][d];
  1. for (int i = 0; i < d; i++)
  2. for (int j = 0; j < d; j++)
  3. arr2[d - 1 - j][i] = arr1[i][j];
  1. for (int row = 0; row < d; row++)
  2. System.out.println(Arrays.toString(arr2[row]));
  3. // [9, 41, 12, 34]
  4. // [8, 25, 50, 22]
  5. // [10, 30, 17, 8]
  6. // [5, 16, 7, 45]

另请参见:
•如何逆时针旋转矩阵90度?
•是否有方法反转多维数组中的特定数组?

展开查看全部

相关问题