我想对布置在板上的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"
答案 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;
}