【发布时间】:2018-05-25 01:13:54
【问题描述】:
我正在努力加快康威的生命游戏。现在,代码查看一个单元格,然后将该点周围的 3x3 区域相加,然后减去我们正在查看的点处的值。这是执行此操作的函数:
static int neighbors2 (board b, int i, int j)
{
int n = 0;
int i_left = max(0,i-1);
int i_right = min(HEIGHT, i+2);
int j_left = max(0,j-1);
int j_right = min(WIDTH, j+2);
int ii, jj;
for (jj = j_left; jj < j_right; ++jj) {
for (ii = i_left; ii < i_right; ii++) {
n += b[ii][jj];
}
}
return n - b[i][j];
}
这是我一直试图用来一次遍历片段的代码:
//Iterates through the first row of the 3x3 area
static int first_row(board b, int i, int j) {
int f = 0;
int i_left = max(0,i-1);
int j_left = max(0,j-1);
int j_right = min(WIDTH, j+2);
int jj;
for (jj = j_left; jj < j_right; ++jj) {
f += b[i_left][jj];
}
return f;
}
//Iterates and adds up the second row of the 3x3 area
static int second_row(board b, int i, int j) {
int g = 0;
int i_right = min(HEIGHT, i+2);
int j_left = max(0,j-1);
int j_right = min(WIDTH, j+2);
int jj;
if (i_right != i) {
for (jj = j_left; jj < j_right; ++jj) {
g += b[i][jj];
}
}
return g;
}
//iterates and adds up the third row of the 3x3 area.
static int third_row(board b, int i, int j) {
int h = 0;
int i_right = min(HEIGHT, i+2);
int j_left = max(0,j-1);
int j_right = min(WIDTH, j+2);
int jj;
for (jj = j_left; jj < j_right; ++jj) {
h += b[i_right][jj];
}
return h;
}
//adds up the surrounding spots
//subtracts the spot we're looking at.
static int addUp(board b, int i, int j) {
int n = first_row(b, i, j) + second_row(b, i, j) + third_row(b, i, j);
return n - b[i][j];
}
但是,由于某种原因,它不起作用。我不知道为什么。
注意事项:
- 有时是
i == i_right,所以我们不想将一行加起来两次。
- 这三个函数应该在单独的部分中与
neighbors2执行完全相同的操作。
-
min和max是为我准备的函数。
- 有时有时是
j == j_right,所以我们不想把一些东西加起来两次。不过,我非常有信心循环会解决这个问题。
- 非常感谢您提供的提示和需要考虑的事项。
谢谢大家。我已经为此工作了几个小时,不知道出了什么问题。看起来它应该可以工作,但我总是在董事会的随机位置得到不正确的解决方案。
【问题讨论】:
-
您是在尝试优化工作代码还是修复损坏的代码?你不能同时做这两件事,这是没有意义的。
-
@RetiredNinja 他试图优化工作代码,结果产生了损坏的代码。
-
看看几十年前迈克尔·阿巴拉什(Michael Abarash)对此的挑战,了解如何快速运行这种愚蠢的...
标签: c