【问题标题】:Diagonal reflection of an int arrayint 数组的对角线反射
【发布时间】:2014-04-08 16:40:23
【问题描述】:

我想对布局在板上的 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"

【问题讨论】:

  • 请向我们展示您的尝试(代码、伪代码)
  • 您有一个可行的解决方案。你认为它有什么问题?
  • 我认为它也很有效,直到我尝试手动更改单个女王的位置,然后再次反映它。结果是错误的,这有点奇怪。我应该假设问题出在其他地方吗?
  • 好吧,如果我这样做,我会保持皇后阵列原样,并简单地移动棋盘,即不会改变皇后的位置,而只是移动整个棋盘,即继续做 n*n 板矩阵的转置。据我所知,移动棋盘根本不会影响已经放置的皇后位置。那样的话,你不会在皇后位置出现错误。
  • @krystah “我试图手动更改单个女王的位置” 这很可能是问题所在。您不能手动更改 single 皇后的位置并保持您的 matrix 排列。您需要更改至少两个皇后以保持排列属性。

标签: java arrays algorithm


【解决方案1】:

由于您的 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}

【讨论】:

    【解决方案2】:

    您打算生成的内容称为矩阵的转置。 从数学上讲,你可以通过交换行和列来做到这一点,所以

    [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];
    

    【讨论】:

    • 是的,我已经看到了使用二维数组的方法,但我需要使用平面 int 数组来完成这项工作!
    • 我认为问题出在使用flat int数组时,假设你在第i行,所以算法假设i-1行已经被覆盖。但是,当你移动棋盘(即改变皇后位置)可能会发生第 i 行可能有皇后,但由于棋盘移动,第 j
    • 解决方案是使用 2 个平面 int 数组,original_array 和 display_array。 original_array 会像 n-queen 一样正常计算,而 display_array 会进行所需的旋转,然后相应地显示 original_array。这里,没有旋转将直接取决于放置皇后的行。
    【解决方案3】:

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

    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;
    }
    

    【讨论】:

      猜你喜欢
      • 2020-02-24
      • 1970-01-01
      • 1970-01-01
      • 2023-03-10
      • 2015-05-09
      • 2022-01-26
      • 2018-07-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多