1

我正在尝试编写一个在 20x60 单元格的网格上实现康威生命游戏的程序。网格应该环绕,以便左侧连接到右侧,顶部连接到底部。

因此,任何位置为 的单元格(0, col)都会在 处有一个邻居(maxRow, col)。任何具有位置的单元格(row, 0)将在 处有一个邻居(row, maxCol)

以下函数应该计算相邻单元格的数量。它适用于不在边缘的坐标,但不适用于边缘的坐标。例如,如果在(0, 10), (0, 11), , 处有点(0, 12),并且(0, 10)传递给函数,它将返回一个高数作为邻居计数而不是1。我知道 mod 运算符%会有所帮助,但我不明白如何使用它。

{
    int i, j;
    int count = 0;
    for (i = row - 1; i <= row + 1; i++)
       for (j = col - 1; j <= col + 1; j++) 
           count += grid[i][j]; }

    if (row==maxrow-1 || row==0)
         count = count+ grid [(row-(maxrow-1))*-1][col-1]+grid[(row-(maxrow-1))*-1][col]+grid[(row-(maxrow-1))*-1][col+1];

    if (col==0 || col==maxcol-1)
         count=count +grid[row-1][(col-(maxcol-1))*-1]+grid[row][(col-(maxcol-1))*-1]+grid[row+1][(col-(maxcol-1))*-1];



    count -= grid[row][col];
    return count;
    } 
4

1 回答 1

1

在提供解决方案之前,让我做一些观察。

  • 添加一些网格值然后减去其他网格值不是一个好主意。您应该首先计算正确的网格坐标。

  • 当您编写 时count += grid[i][j];,您正在使用可能无效的数组索引。例如,i = row - 1row为零时,产生的i值为-1

  • 您的代码暗示这maxrow是行数,因为您正在编写maxrow-1,但名称maxrow暗示了最大行索引。这令人困惑。最好叫行数numRows,然后最大的行索引是numRows - 1。同样,最好替换maxcolnumCols.

现在到了问题的核心。该值row - 1可以等于-1row + 1也可以等于numRows。这两个都是无效的行索引。同样,col - 1andcol + 1可能导致无效的列索引-1numCols. 解决问题的一种方法是测试这些特定值并用环绕索引替换它们:

int count = 0;
for (int i = row - 1; i <= row + 1; i++) {
  int R = i;
  if (R == -1) {
    R = numRows - 1;
  } else if (R == numRows) {
    R = 0;
  }
  for (int j = col - 1; j <= col + 1; j++) {
    if (i == row && j == col) {
      continue;  // Skip grid[row][col].
    }
    int C = j;
    if (C == -1) {
      C = numCols - 1;
    } else if (C == numCols) {
      C = 0;
    }
    count += grid[R][C];
  }
}

这是解决问题的一种高性能方法,因为测试和赋值是比模运算更快的运算,但它也需要很多代码。我们可以借助模运算符编写更简洁的代码。

我们想写i % numRows,除了 C++ 在为 -1 时将其评估为i-1。这是因为模运算对于负值是不明确的,并且C++ 选择了一种不能保证非负结果的解释。

为了解决这个问题,我们在取模之前添加numRows到。这确保我们总是取正数的模。现在我们可以计算如下八个邻居中的活细胞数量。inumRowsgrid[row][col]

int count = 0;
for (int i = row - 1; i <= row + 1; i++) {
  for (int j = col - 1; j <= col + 1; j++) {
    if (i == row && j == col) { 
      continue;  // Skip grid[row][col].
    }
    count += grid[(i + numRows) % numRows][(j + numCols) % numCols];
  }
}
于 2015-09-18T17:56:47.100 回答