下面的程序(感谢Sundial)计算矩形区域
公共类ComputeTheArea {public static int areaOfTheRectangle (char[][] table, char ch) {
int[] first = new int[2];
int[] last = new int[2];
for (int i=0; i<3; i++) {
for (int j=0; j<4; j++) {
if(grid[i][j]==ch) {
first[0] = i;
first[1] = j;
}
}
}
for (int i=2; i>=0; i--) {
for (int j=3; j>=0; j--) {
if(grid[i][j]==ch) {
last[0] = i;
last[1] = j;
}
}
}
int answer = ((Math.max(first[0]+1,last[0]+1) - Math.min(first[0]+1,last[0]+1)) *
(Math.max(first[1]+1,last[1]+1) - Math.min(first[1]+1,last[1]+1)));
return answer;
}
然而,当它运行时,它会输出错误的答案。我知道for循环有问题。我是Java的新手,我需要你帮助我修复方法。非常感谢你!
编辑:我编辑了代码以符合迈克尔的答案。
答案 0 :(得分:1)
首先,您不要使用第一个循环搜索矩阵中的所有元素 其次,当你找到比赛时你不会休息 此外,这种方法有点缺陷。例如,请参阅此矩阵:
a b c b
a _ c d
x z b a
在这里,您不知道要在第一行停留哪个b
才能获得整个b
方格。
如果您只是循环遍历整个矩阵并保存最大和最小(first
和last
)x和y坐标,则可以非常轻松地计算该区域。看到这段代码:
public static int charArea (char[][] grid, char ch) {
int[] first = new int[] {100, 100};
int[] last = new int[] {-1, -1};
for (int i=0; i<3; i++) {
for (int j=0; j<4; j++) {
if(grid[i][j]==ch) {
first[0] = Math.min(i, first[0]);
first[1] = Math.min(j, first[1]);
last[0] = Math.max(i, last[0]);
last[1] = Math.max(j, last[1]);
}
}
}
int answer = (last[0] - first[0] + 1) * (last[1] - first[1] + 1);
return answer;
}
答案 1 :(得分:0)
一旦找到角色,for循环可能会破坏。
第一个for循环设置j = i。那应该是j = 0而不是。
我不认为长度计算是正确的。两个术语都应添加1。即first = 0和last = 3的东西的长度应该是last + 1-first = 4,而不是现在的3。