好的,所以我有一个像这样的数组:
1 2 3
4 5 6
7 8 9
不一定要有任何特定的尺寸,只是展示它,以便你们有一些东西要看。 所以我必须遍历每个数字,并计算它周围的数字的平均值。例如,对于数字1,我必须计算平均值2,5和4.我必须将该平均值与数字本身进行比较,但这不是我的问题。我的问题是运行任何大小的数组(由用户确定)并检查它周围的数字。 现在,我可以为每个部分编写一个单独的方法,这意味着每个角落都有一个单独的方法,每个角落都有一个单独的方法,以及一个中心的方法。但这听起来像是更多的工作而且效率低得多。所以,我决定在外面做一个边界。假设0永远不是输入值,此边框将填充0。这样我就不会用完我的数组了,但是我可以在这个边框内部运行一个编码函数,这样就可以计算出8个周围数字的平均值。
所以我想知道如何通过数组运行并忽略它遇到的任何0,但是取其周围的其他数字的平均值?
例:
0 0 0 0 0
0 1 2 3 0
0 4 5 6 0
0 7 8 9 0
0 0 0 0 0
所以在第一个位置,它取数字2,4和5的平均值,但忽略0。我需要忽略它们的原因是因为:
1.我不能将它们包含在数字计数中,因为即使添加0不会影响总数,它也会影响在获得平均值时除以的数字量。
2.我实际上不会使用0,因为0是可能的输入,它实际上是-1。为了便于打字和阅读,我把0放在这里。
建议最好的解决方法吗?
EDIT2:
所以现在,我得到的输出接近我应该得到的。但是我已经彻底查看了,我看不出这个错误的来源。
public static int calculate(int[][] array, int row, int col){
double num = 0;//Used to find the total of real numbers to be divided by
double total = 0;
double average;
for (int a = -1; a <= 1; a++)
{
for (int b = -1; b <= 1; b++)
{
if(row + a < 0 || col + b < 0)
{
continue;
}
if(a == 0 && b == 0)//if(row + a == row || col + b == col)
{
continue;
}
if(row + a >= r || col + b >= c)
{
continue;
}
else
{
num+=1;
total+= array[row + a][b + col];
System.out.println("row+a = " + (row + a) + " and col+b = " + (col + b));
}
}
}
average = (double)(total/num);
count++;
System.out.print(count + ". Average = " + total + " divided by " + num + " = " + average + "\n");
if (average < array[row][col])
return 255;
else
return 0;
}
在这个函数中,我将数组中的每个值(通过每一行)更改为0或255。 显然,正确的最终结果应该是: 0 255 0 255 0
0 0 255 0 0
255 0 255 0 255
255 0 0 0 0
0 255 0 0 255
但我得到了
0 255 0 255 0
0 0 0 0 0
255 0 255 0 255
0 0 0 0 0
255 0 255 0 255
所以我正在研究这些具体的差异,我将会看到问题所在。
答案 0 :(得分:3)
所以,我决定在外面做一个边界。
Trivia - Dan和Kathy Spacklen(Spacken?)30年前写了Sargon时,他们用棋盘做了这个棋子。
你可以做边境,但我认为它不会有多大帮助。告诉我,在你的第一个例子中
1 2 3
4 5 6
7 8 9
假设#1为[0] [0],那么围绕#2的8个单元的索引是什么?
答案 1 :(得分:3)
在我看来,最简单的解决方案是遍历循环中的所有可能单元格,并为每个单元格查看它是否在矩阵内部。它并不完全是短暂的,但是没有任何丑陋的不可读条件,你不需要用任何东西包围矩阵。
int sum = 0;
int amount = 0;
for (int di = -1; di <= 1; ++di) {
for (int dj = -1; dj <= 1; ++dj) {
// check that cell (i0 + di, j0 + dj) is inside the matrix
// and not the original cell (i0, j0)
// increase 'sum' and 'amount' if necessary
}
}
return (double) sum / amount;
修改强>
删除了部分代码以在问题中留下一些挑战
答案 2 :(得分:3)
以下是我用来确定某个单元格是否在the game of life中生存或死亡的代码。
private static boolean lives(Point p, byte[][] squares) {
int liveNeighboors = 0;
for (int i = p.x - 1; i < p.x + 2; i++) {
for (int j = p.y - 1; j < p.y + 2; j++) {
if (new Point(i, j).equals(p))
continue;
try {
liveNeighboors += squares[i][j];
} catch (Exception e) {
// this happens if you try to sum an edge space
}
}
}
if (squares[p.x][p.y] == 0) {
return liveNeighboors == 3;
} else {
return liveNeighboors == 2 || liveNeighboors == 3;
}
}
您可以对此进行调整以对数字求和并返回平均值,而不是单元格是否应该存在或死亡。
这需要在循环中调用:
for(int i = 0; i < arr.length; i++) {
for (int j = 0;j < arr[0].length; j++) {
lives(new Point(i,j), arr);
}
}