2D数组中的每个元素都被视为巧克力。除了每一行和每一列的最大巧克力数量之外,我需要选择最大数量的巧克力。我编写了一个程序,但是对于下面提到的示例,它没有产生正确的结果。
1 4 0 5 2 | 4
2 1 2 0 1 | 1
0 2 3 4 4 | 3
0 3 0 3 1 | 1
1 2 2 1 1 | 1
列:1+3+2+4+2=12
行:4+1+3+1+1=10
总计:12+10=22
输出应为22,但我下面连接的程序的输出为20。
public int calc(int[][] grid, int rows, int columns){
int[][] check = new int[rows][columns];
int max, pos;
for(int i=0; i<rows; i++){
max = grid[i][0];
pos = 0;
for(int j=0; j<columns; j++){
if(grid[i][j] >= max){
max = grid[i][j];
pos = j;
}
}
check[i][pos] = 1;
}
for(int j=0; j<columns; j++){
max = grid[0][j];
pos = 0;
for(int i=0; i<rows; i++){
if(grid[i][j] >= max){
max = grid[i][j];
pos = i;
}
}
check[pos][j] = 1;
}
int total = 0;
for(int i=0; i<rows; i++){
for(int j=0; j<columns; j++){
if(check[i][j]!=1){
total += grid[i][j];
}
}
}
return total;
}
答案 0 :(得分:0)
您的应用程序没有考虑到列中的max
和行中的max
可能是同一元素(或可选地)。例如,行1具有2 1 2 0 1
。第一个2
是第0列的max
,但两个2
都是第1行的最大值。您的应用程序将第一个2
标记为第{{1 }},第二个max
作为第一个循环中的行2
。
请注意,第二行中的值max
也存在类似情况,但是在这种情况下,您的应用程序仅将4
中的一个标记为最大值(因为您正在检查两个循环中的4
如果只检查>= max
,则> max
在第1行中是正确的,但您的2
在第2行中会被弄乱)。
如果您的示例肯定要返回22,则您需要添加逻辑以检查行和列上4
值的交集。
以下是蛮力更新,保留了您大多数的逻辑/结构。我更新了max
数组以保留找到的最大值,而不是仅保留check
,并添加了一个附加的嵌套循环,该循环检查每行是否有相等的1
值。在上一个循环中,我将max
的检查更新为!=1
。
==0