我想要在板中布局的int数组上执行对角线反射,从左向右下降,在对角线周围反射。这是一种在与皇后之谜合作的同时,“翻转棋盘”的尝试。
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"发布于 2014-04-08 16:46:39
由于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}发布于 2014-04-08 16:48:15
你想要产生的东西,叫做矩阵的转置。在数学上,您可以通过交换行和列来实现这一点,所以
[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];发布于 2014-04-08 16:49:27
如果我正确理解了你想要的,我想这就是你想要的:
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;
}https://stackoverflow.com/questions/22943181
复制相似问题