【发布时间】: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排列。您需要更改至少两个皇后以保持排列属性。