@MuffinLover

Как можно отрефакторить эти циклы?

https://pastebin.com/5dfvJ1wa
Можно ли как-то эти циклы отрефакторить? А то слишком жуткие получились
А как красивей не понимаю
  • Вопрос задан
  • 77 просмотров
Пригласить эксперта
Ответы на вопрос 1
wataru
@wataru
Разработчик на С++, экс-олимпиадник.
Я так понял, вы там перебираете 8 соседей клетки на замкнутом поле (после последней строки идет первая, перед певрой идет последняя и так же для столбцов). Вам поможет опреация взятия остатка от деления (она же деление по модулю).

Можно так:
for (int dx = -1; dx <= 1; ++dx) {
  for (int dy = -1; dy <= 1; ++dy) {
    if (dx == 0 && dy == 0) continue;
    int nx = (i + dx + height) % height;
    int ny = (j + dy + SIZE) % SIZE;
    neighbours += proc_states[iter][nx * SIZE + ny];
  }  
}


Или можно завести
const int dx[8] = {0, 1, 1, 1, 0, -1, -1, -1};
const int dy[8] = { 1, 1, 0, -1, -1, -1, 0, 1};
...
for (int k = 0; k < 8; ++k) {
  int nx = i + dx[k];
  int ny = j + dy[k];
  ...
}


Можно не заводить временные переменные и ужать код до двух строк.

В конструкции (i + dx + SIZE) % SIZE есть лишний +SIZE, ибо -1 % SIZE == -1 и чтобы для 0 предыдущее значение было SIZE-1 надо прибавить лишний SIZE под модулем.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы