Как мне исправить мой код и сделать так, чтобы он перебирал все строки в моем 2D массиве? (C ++) - PullRequest
0 голосов
/ 24 апреля 2019

Мой код перебирает матрицу, которая преобразуется в двумерный массив, однако, когда я пытаюсь изменить значения на основе определенных правил, код никогда не достигает последней строки. Там нет ошибки, программа просто заканчивается до достижения последней строки. Может случиться так, что массив выходит за пределы, когда он получает количество соседних ячеек, однако я предполагаю, что из-за этого появится сообщение об ошибке, и я не уверен, почему это не сработает, я предположил, что получил условия в утверждениях if правильные, но, возможно, нет.

2D-массивы, которые я использовал для проверки своего кода, выглядят следующим образом (я думал, что это сократит код и позволит лучше понять, как используется 2D-массив и как он выглядит)

row0: 1000
Ряд 1: 0111
Ряд 2: 0010

а также

row0: 1000
Ряд 1: 0111
Ряд 2: 0010
Ряд 3: 0100
Ряд 4: 0001

оба всегда останавливаются до достижения последнего ряда.

Ниже приведен мой код, его немного, но я думаю, что необходимо диагностировать проблему.

Функция getNeighbors в основном просто смотрит на положение строки и столбца и считает количество 1, окружающее ее, каждая ячейка имеет не более 8 соседей (у ячеек на краю мира будет меньше).

int getNeighbors(int **Bacteria, int rows, int columns, int  row, int column) {

    int count = 0;


    if (row==0 && column==0) {

        if (Bacteria[row+1][column+1] == 1) {
            count++;
        }
        if (Bacteria[row][column+1] == 1) {
            count++;
        }
        if (Bacteria[row+1][column] == 1) {
            count++;
        }
        return count;
    } else if (row==rows && column==columns) {

        if (Bacteria[row-1][column-1] == 1) {
            count++;
        }
        if (Bacteria[row][column-1] == 1) {
            count++;
        }
        if (Bacteria[row-1][column] == 1) {
            count++;
        }
        return count;
    } else if (row==rows && column==0) {

        if (Bacteria[row-1][column+1] == 1) {
            count++;
        }
        if (Bacteria[row][column+1] == 1) {
            count++;
        }
        if (Bacteria[row-1][column] == 1) {
            count++;
        }
        return count;
    } else if (row==0 && column==columns) {
        if (Bacteria[row+1][column-1] == 1) {
            count++;
        }
        if (Bacteria[row][column-1] == 1) {
            count++;
        }
        if (Bacteria[row+1][column] == 1) {
            count++;
        }
        return count;
    } else if (row==0) {
        if (Bacteria[row+1][column+1] == 1) {
            count++;
        }
        if (Bacteria[row][column-1] == 1) {
            count++;
        }
        if (Bacteria[row][column+1] == 1) {
            count++;
        }
        if (Bacteria[row+1][column] == 1) {
            count++;
        }
        if (Bacteria[row+1][column-1] == 1) {
            count++;
        }
        return count;
    } else if (row==rows) {
        if (Bacteria[row-1][column+1] == 1) {
            count++;
        }
        if (Bacteria[row][column-1] == 1) {
            count++;
        }
        if (Bacteria[row][column+1] == 1) {
            count++;
        }
        if (Bacteria[row-1][column] == 1) {
            count++;
        }
        if (Bacteria[row-1][column-1] == 1) {
            count++;
        }
        return count;
    } else if (column==0) {
        if (Bacteria[row+1][column+1] == 1) {
            count++;
        }
        if (Bacteria[row][column+1] == 1) {
            count++;
        }
        if (Bacteria[row+1][column] == 1) {
            count++;
        }
        if (Bacteria[row-1][column] == 1) {
            count++;
        }
        if (Bacteria[row-1][column+1] == 1) {
            count++;
        }
        return count;

    } else if (column==columns) {
        if (Bacteria[row-1][column-1] == 1) {
            count++;
        }
        if (Bacteria[row][column-1] == 1) {
            count++;
        }
        if (Bacteria[row-1][column] == 1) {
            count++;
        }
        if (Bacteria[row+1][column] == 1) {
            count++;
        }
        if (Bacteria[row+1][column-1] == 1) {
            count++;
        }
        return count;
    } else {
        if (Bacteria[row-1][column+1] == 1) {
            count++;
        }
        if (Bacteria[row][column-1] == 1) {
            count++;
        }
        if (Bacteria[row][column+1] == 1) {
            count++;
        }
        if (Bacteria[row-1][column] == 1) {
            count++;
        }
        if (Bacteria[row+1][column] == 1) {
            count++;
        }
        if (Bacteria[row+1][column+1] == 1) {
            count++;
        }
        if (Bacteria[row+1][column-1] == 1) {
            count++;
        }
        if (Bacteria[row-1][column-1] == 1) {
            count++;
        }
        return count;
    }



}

void changeGeneration(int **Bacteria, int rows, int columns) {

    for (int x = 0; x < rows; x++) {
        for (int y = 0; y < columns; y++) {
            int count = getNeighbors(Bacteria, rows, columns, x, y);

            if (Bacteria[x][y] == 1 && count < 2) {
                Bacteria[x][y] = 0;
            } else if (Bacteria[x][y] == 1 && count > 3) {
                Bacteria[x][y] = 0;
            } else if (Bacteria[x][y] == 0 && count == 3) {
                Bacteria[x][y] = 1;
            }
        }
    }
}

1 Ответ

3 голосов
/ 24 апреля 2019

Прежде всего, есть гораздо более простой способ выразить то, что вы пытаетесь сделать:

  int count = 0;
  for (int n_row = row - 1; n_row <= row + 1; ++n_row) {
    for (int n_col = col - 1; n_col <= col + 1; ++n_col) {
      if (n_row >= 0 && n_row < rows && n_col >= 0 && n_col < columns
          && (n_row != row || n_col != col)) {
        if (Bacteria[n_row][n_col] == 1) {
            ++count;
        }    
      } 
    }
  } 

Во-вторых, когда вы говорите, что он не достигает последней строки, каково значение rows в ваших примерах? Имейте в виду, что общее количество строк на единицу больше, чем самый высокий индекс строки. Так что если у вас есть строки 0, 1, 2, 3 и 4, rows должно быть 5.

...