Сложные условия следует разбивать на простые. равно как и слдожные функции следует разбивать на простые.
(qX >= 0 && qY >= 0 && qX < room_size && qY < room_size)
Это условие, как я вижу, проверяет вхождение я прямоугольник? Лучше всего в отдельную функцию. Повысит читаемость.
например так:
bool isInRoom(int qX, int qY, int room_size)
{
if (qX < 0)
return false;
if (qY < 0)
return false;
if (qX >= room_size)
return false;
if (qY >= room_size)
return false;
return true;
}
Боитесь за производительность - inline функцию. Затем так:
if (isInRoom(qX, qY, room_size) && water[qX][qY] < water[x][y] && water[x][y] != 0)
...
или так:
if (! isInRoom(qX, qY, room_size)) // проверка предусловия
return;
if (water[qX][qY] < water[x][y] && water[x][y] != 0)
...