int数组的对角线反射

时间:2014-04-08 16:40:23

标签: java arrays algorithm

我想对布置在板上的int数组执行对角线反射,反射从左到右的对角线。这是尝试在使用N queens puzzle时“翻转棋盘”。

  • 阵列显示在尺寸为n*n
  • 的纸板上
  • 数组的长度为n
  • 数组的索引表示行(即arr[0]表示顶行)
  • 索引处的值代表女王的水平位置(即arr[2] = 3;意味着“在第3行第4列放置女王”(从零开始的索引))

示例

int[] matrix = {0,2,4,1,3};

将显示为

[Q x x x x]
[x x Q x x]
[x x x x Q]
[x Q x x x]
[x x x Q x]

运行命令后

matrix = diagonalReflection(matrix);

矩阵应如下所示(注意,反射基于下降的对角线)

[Q x x x x]
[x x x Q x]
[x Q x x x]
[x x x x Q]
[x x Q x x]

我将如何相应地交换元素以实现此结果?

更新
我已经尝试了5-10种不同的方法,但这是我到目前为止使用的方法:

public static Board diagonalReflection(Board src){

    int n = src.size();
    Board dest = new Board(n);

    for (int i = 0; i < n; i++)
        dest.set(src.get(i), i);

    return dest;
}

功能说明:

Board.get(x) means "return arr[x]"
Board.set(x, y) means "arr[x] = y"

3 个答案:

答案 0 :(得分:2)

由于您的int[] matrix变量是排列,因此您可以使用简单的for循环构建反射,如下所示:

int[] reflected = new int[matrix.length];
for (int i = 0 ; i != matrix.length ; i++) {
    reflected[matrix[i]] = i;
}

在样本matrix上运行此循环会产生预期的

{0, 3, 1, 4, 2}

答案 1 :(得分:0)

您打算生成的内容称为矩阵的转置。 从数学角度来说,你可以通过交换行来实现这一点。列,所以

[1 2 3]
[4 5 6]
[7 8 9] 

成为

[1 4 7]
[2 5 8]
[3 6 9]

程序方面,逻辑是:

new_matrix[i][j]=old_matrix[j][i];

答案 2 :(得分:0)

如果我理解你想要什么,我认为这就是你想要的:

public int[] diagonalReflexion(int[] matrix) {
  int[] result = new int[matrix.length];
  for (int i=0; i<matrix.length; i++) {
    result[matrix[i]] = i;
  }
  return result;
}