gpt4 book ai didi

java - 在 3D Young Tableau 上调用 Maxify?

转载 作者:行者123 更新时间:2023-12-01 11:07:21 28 4
gpt4 key购买 nike

我正在创建一个最大 3D young 画面,因此 int[0][0][0] 将具有画面中最大的整数。所有行、列和 Pane 均按降序排序。我正在尝试为此创建 maxify 方法,但效果不太好。我尝试修改 here 中的 youngify 方法,这就是我到目前为止所拥有的:

private void maxify(int i, int j, int k) {
int largex = 0, largey = 0, largez = 0, x = 0, y = 0, z = 0;
while (true) {
x = largex;
y = largey;
z = largez;
if (x + 1 > i && x + 1 < tableau.length && tableau[x + 1][y][z] > tableau[x][y][z]) {
largex = x + 1;
largey = y;
largez = z;
}
if (y + 1 > j && y + 1 < tableau[0].length
&& tableau[x][y + 1][z] > tableau[largex][largey][largez]) {
largex = x;
largey = y + 1;
largez = z;
}
if (z + 1 > k && z + 1 < tableau[0][0].length
&& tableau[x][y][z + 1] > tableau[largex][largey][largez]) {
largex = x;
largey = y;
largez = z + 1;
}
if (largex != x || largey != y || largez != z) {
tableau[x][y][z] = tableau[x][y][z] ^ tableau[largex][largey][largez];
tableau[largex][largey][largez] = tableau[x][y][z]
^ tableau[largex][largey][largez];
tableau[x][y][z] = tableau[x][y][z] ^ tableau[largex][largey][largez];
maxify(largex, largey, largez);
} else
break;
}
}

下面是在 3x3x1 数组上调用时发生的情况的示例。

Starting with this array:
123
456
789

After first loop:
423
156
789

And so on....
423
156
789

423
756
189

423
756
189

423
756
819

423
756
819

423
756
891

423
756
891

423
756
891

完成的数组:

423

756

891

根本没有完全排序。谁能看出我错过了什么吗?

最佳答案

原始的youngify()方法实际上并没有对整个二维数组进行排序!问题是,在检测到要完成交换后,例如在第二行,下一次迭代从交换发生的位置(即从第二行开始)开始,而不管第一行的元素可能需要的其他交换行,但在其他维度上。换句话说,它首先垂直地然后水平地向下筛选第一个元素。

这就是程序输出显示的内容:1 垂直移动,与 4 和 7 交换,然后水平移动,与 8 和 9 交换。总之,youngify()无论数组的其余部分如何,方法都会正确地向下筛选左上角的元素。使用 {{9, 8, 7}, {6, 5, 4}, {3, 2, 1}} 尝试原始的 youngify() 方法数组,您会看到行为完全相同。

反复筛选左上角元素可以完成这项工作吗?不一定:如果最高元素已经位于左上角位置,则根本不会[进一步]排序。

我的建议是对每个维度的多维数组“行”进行“行”排序。我编写了以下代码:

private static void maxify(int[][][] tableau) {
int ii = tableau.length;
int jj = tableau[0].length;
int kk = tableau[0][0].length;
// Sort on k-rows
for (int i = 0; i < ii; i++) {
for (int j = 0; j < jj; j++) {
// Since k-rows are already standard arrays, no temporary array needed here.
reverseSort(tableau[i][j]);
}
}
// Sort on j-rows
for (int i = 0; i < ii; i++) {
for (int k = 0; k < kk; k++) {
int[] temp = new int[jj];
for (int j = 0; j < jj; j++) {
temp[j] = tableau[i][j][k];
}
reverseSort(temp);
for (int j = 0; j < jj; j++) {
tableau[i][j][k] = temp[j];
}
}
}
// Sort on i-rows
for (int j = 0; j < jj; j++) {
for (int k = 0; k < kk; k++) {
int[] temp = new int[ii];
for (int i = 0; i < ii; i++) {
temp[i] = tableau[i][j][k];
}
reverseSort(temp);
for (int i = 0; i < ii; i++) {
tableau[i][j][k] = temp[i];
}
}
}
}

private static void reverseSort(int[] a) {
Arrays.sort(a);
for (int i = 0; i < a.length / 2; i++) {
a[i] ^= a[a.length - i - 1];
a[a.length - i - 1] ^= a[i];
a[i] ^= a[a.length - i - 1];
}
}

我希望这会有所帮助......

干杯,

杰夫

关于java - 在 3D Young Tableau 上调用 Maxify?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32804746/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com