在二维数组中查找重复的单元格 java
Find repeated cell in 2D array java
我有一个 3x3 矩阵:
1 -1 0 0
1 2 2 1
1 1 1 -1
-1 0 3 6
我试图找到值 = -1 的单元格的对角线元素,并将对角线单元格 ([i-1][j-1],[i-1][j+1] ,[i+1][j-1],[i+1][j+1]) 值与 2. 到目前为止我已经实现了这个但似乎单元格 [1][2] 即第二行第三列, 与 2 个单元格成对角线,它们是 [0][1] 和 [2][3]。所以,我得到的数组应该是这样的:
1 -1 0 0
2 2 4 1
1 2 1 -1
-1 0 6 6
看起来像这样:
1 -1 0 0
2 2 8 1
1 2 1 -1
-1 0 6 6
即单元格 [1][2] 中的值是 8 而不是 4。那么我如何检查单元格是否已经访问过一次并乘以2以便它不能再次乘以。这是我试过的代码:
for (int i = 0; i <= x; i++) {
for (int j = 0; j <= y; j++) {
if (resultArray[i][j] == -1) {
if (isAdjacent(i - 1, j - 1, x, y))
resultArray[i - 1][j - 1] *= 2;
if (isAdjacent(i - 1, j + 1, x, y))
resultArray[i - 1][j + 1] *= 2;
if (isAdjacent(i + 1, j - 1, x, y))
resultArray[i + 1][j - 1] *= 2;
if (isAdjacent(i + 1, j + 1, x, y))
resultArray[i + 1][j + 1] *= 2;
}
}
}
return resultArray;
static boolean isAdjacent(int i, int j, int x, int y) {
boolean flag = false;
if (i >= 0 && i <= x && j >= 0 && j <= y) {
flag = true;
}
return flag;
}
在与 -1 成对角线的位置创建一个带有 true 或 false 的二维布尔数组,然后通过将矩阵中所有位于 true 位置的数字乘以 2 来更新矩阵。这样,任何值都不会乘以两次。
所以你可以初始化布尔数组:
boolean diagonalsArray[][] = new boolean[x][y];
然后而不是乘以位置
resultArray[i + 1][j + 1] *= 2;
在布尔数组中将这些位置设置为 true:
diagonalsArray[i + 1][j + 1] = true;
在你的 for 循环和 return resultArray 之间,做所有的乘法
for (int i = 0; i <= x; i++) {
for (int j = 0; j <= y; j++) {
if(diagonalsArray[i][j]){
resultArray[i][j] *= 2;
}
}
}
我有一个 3x3 矩阵:
1 -1 0 0
1 2 2 1
1 1 1 -1
-1 0 3 6
我试图找到值 = -1 的单元格的对角线元素,并将对角线单元格 ([i-1][j-1],[i-1][j+1] ,[i+1][j-1],[i+1][j+1]) 值与 2. 到目前为止我已经实现了这个但似乎单元格 [1][2] 即第二行第三列, 与 2 个单元格成对角线,它们是 [0][1] 和 [2][3]。所以,我得到的数组应该是这样的:
1 -1 0 0
2 2 4 1
1 2 1 -1
-1 0 6 6
看起来像这样:
1 -1 0 0
2 2 8 1
1 2 1 -1
-1 0 6 6
即单元格 [1][2] 中的值是 8 而不是 4。那么我如何检查单元格是否已经访问过一次并乘以2以便它不能再次乘以。这是我试过的代码:
for (int i = 0; i <= x; i++) {
for (int j = 0; j <= y; j++) {
if (resultArray[i][j] == -1) {
if (isAdjacent(i - 1, j - 1, x, y))
resultArray[i - 1][j - 1] *= 2;
if (isAdjacent(i - 1, j + 1, x, y))
resultArray[i - 1][j + 1] *= 2;
if (isAdjacent(i + 1, j - 1, x, y))
resultArray[i + 1][j - 1] *= 2;
if (isAdjacent(i + 1, j + 1, x, y))
resultArray[i + 1][j + 1] *= 2;
}
}
}
return resultArray;
static boolean isAdjacent(int i, int j, int x, int y) {
boolean flag = false;
if (i >= 0 && i <= x && j >= 0 && j <= y) {
flag = true;
}
return flag;
}
在与 -1 成对角线的位置创建一个带有 true 或 false 的二维布尔数组,然后通过将矩阵中所有位于 true 位置的数字乘以 2 来更新矩阵。这样,任何值都不会乘以两次。
所以你可以初始化布尔数组:
boolean diagonalsArray[][] = new boolean[x][y];
然后而不是乘以位置
resultArray[i + 1][j + 1] *= 2;
在布尔数组中将这些位置设置为 true:
diagonalsArray[i + 1][j + 1] = true;
在你的 for 循环和 return resultArray 之间,做所有的乘法
for (int i = 0; i <= x; i++) {
for (int j = 0; j <= y; j++) {
if(diagonalsArray[i][j]){
resultArray[i][j] *= 2;
}
}
}