в юности в компьютерном кружке для решения логических задач нам выдавали листок и ручку.
эта тоже решается без рекурсии да и вообще без компьютера.
так как двигаться мы можем только вниз и вправо, то количеством путей от текущей клетки до конца будет суммарное количество путей от нижней и правой клеток до конца.
поэтому заполнять таблицу будем снизу вверх и справа налево - от конца к началу:
в конечную клетку ставим число 1.
далее в каждую следующую клетку записываем сумму значений правой и нижней клеток от нее.
закрашенные клетки оставляем пустыми.
ответ будет в первой клетке.
c++
https://ideone.com/1d8y6b
int row[width + 1] = {};
row[width - 1] = 1;
for (int y = height - 1; y >= 0; y--) {
for (int x = width - 1; x >= 0; x--) {
row[x] = maze[y][x] ? 0 : row[x] + row[x + 1];
}
}

Банальнейшая рекурсия. Тупо перебираем все возможные пути.
static int[][] matrix = {
{0, 0, 0, 0, 0, 1, 1, 1},
{0, 0, 1, 0, 0, 0, 0, 1},
{0, 0, 0, 0, 0, 0, 0, 0},
{0, 1, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 1, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0},
{1, 1, 0, 0, 0, 1, 0, 0},
{1, 1, 0, 0, 0, 0, 0, 0}
};
static int cnt(int x, int y) {
if (x == 7 && y == 7) { return 1; } // Достигли точки назначения
if (x >= 8 || y >= 8 || matrix[y][x] != 0) { return 0; } // Упёрлись или выскочили за пределы
return cnt(x, y + 1) + cnt(x + 1, y); // Движемся в обе стороны
}
public static void main(String[] args) {
System.out.println(cnt(0, 0)); // Вычисляем и печатаем ответ
}
Очень даже просто!
Один путь Я точно нашла, а остальные ищи сам аналогичным способом)
Вниз, вправо, вниз, вправо, вниз, вправо, вверх, вправо, вниз, вправо, вниз, вправо, вниз, вправо, вниз, влево, вниз, вправо)
Я понимаю, что это Джава-тред, но эта необходимость возникла внезапно, а я не слишком (от слова "вообще") разбираюсь в Джаве, чтобы перевести самому, а знания в синтаксисе C++ у меня, хотя бы, чуть больше, чем никакие.