gpt4 book ai didi

c - 优化康威的人生游戏

转载 作者:太空宇宙 更新时间:2023-11-04 04:17:10 24 4
gpt4 key购买 nike

我正在努力加快 Conway 的 Game of Life。现在,代码查看一个单元格,然后将该点周围的 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];
}

但是,由于某种原因,它不起作用。我不知道为什么。

注意事项:

  1. 有时 i == i_right,所以我们不想将一行相加两次。
  2. 这三个函数应该在不同的部分中执行与 neighbors2 完全相同的操作。
  3. minmax 是为我预制的函数。
  4. 有时 j == j_right,所以我们不想将某项相加两次。不过,我非常有信心循环会解决这个问题。
  5. 感谢提示和需要考虑的事项。

谢谢大家。我已经为此工作了几个小时,但不知道出了什么问题。看起来它应该可以工作,但我总是在董事会中的随机位置得到不正确的解决方案。

最佳答案

neighbors2 中,您设置了 i_lefti_right 以便将它们限制在网格的行中。如果当前单元格位于顶行或底行,则只循环遍历两行而不是 3 行。

first_row()last_row() 中,您还将其限制为网格的行。但结果是这些函数会将单元格添加到与当前单元格相同的行中,这就是 second_row 所做的。因此,您最终将这些行添加了两次。

i = 0 时你不应该调用 first_row(),当 时你不应该调用 third_row()我 == 高度

static int addUp(board b, int i, int j) {
int n = (i == 0 ? 0 : first_row(b, i, j)) +
second_row(b, i, j) +
(i == HEIGHT ? 0 : third_row(b, i, j));
return n - b[i][j];
}

另一种选择是在函数本身中进行检查:

function first_row((board b, int i, int j) {
if (i == 0) {
return 0;
}
int f = 0;
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][jj];
}

return f;
}

third_row() 也类似。但是在调用者中这样做可以节省函数调用的开销。

顺便说一句,你的变量名很困惑。所有 i 变量都是针对行的,行是从上到下,而不是从左到右。

关于c - 优化康威的人生游戏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50520150/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com