Как проверить, находится ли позиция в моем векторе векторов вне границ? - PullRequest
0 голосов
/ 10 ноября 2018

У меня есть вектор векторов, заполненный символами из текстового файла.По сути, это простой симулятор вспышки, в котором заражены символы «i», а символы «s» подвержены заражению.Смысл в том, чтобы пройти через матрицу, и если она встретит «i», то она изменит все «s» вокруг нее на «i».Я сталкиваюсь с проблемой при проверке элементов вокруг него из-за проверки положения за пределами границ матрицы.Есть ли способ проверить эти границы в моих операторах if?

Вот код:

for (int i = 0; i < population.size(); i++) {  
        for(int j = 0; j < population[i].size(); j++) {

            if(population[i][j] == 'i') {

                if(population[i-1][j] == 's') { 
                    population[i-1][j] = 'i';
                }
                if(population[i-1][j+1] == 's') {
                    population[i-1][j+1] = 'i';
                }
                if(population[i][j+1] == 's') {
                    population[i][j+1] = 'i';
                }
                if(population[i+1][j+1] == 's') {
                    population[i+1][j+1] = 'i'; 
                }
                if(population[i+1][j] == 's') {
                    population[i+1][j] = 'i';
                }
                if(population[i+1][j-1] == 's') {
                    population[i+1][j-1] = 'i';
                }
                if(population[i][j-1] == 's') {
                    population[i][j-1] = 'i';
                }
            }
        }
    }

1 Ответ

0 голосов
/ 10 ноября 2018

Вместо прямой ссылки на конкретную запись массива, вы можете сделать что-то вроде следующего:

void checkForInfectionAndInfectIfNeeded(int i, int j) {
    for (int row = -1; row <= 1; row++) {
        for (int column = -1; column <=1; column++) {
            infect(i + row, j + column);
        }
    }
}

void infect(int i, int j) {
    if (i < 0 || i >= population.size() || j < 0 || j >= population[j].size()) {
       return;
    } else {
       population[i][j] = 'i';
    }
}

Таким образом, метод infect является единственным, который проверяет границы, и вы заменяете свой длинный список проверки окрестностей вручную двумя циклами.

...