// Nombre de chemins du haut-gauche au bas-droite // Version Programmation dynamique // https://www.geeksforgeeks.org/count-number-of-ways-to-reach-destination-in-a-maze/ #include using namespace std; size_t findWays(const vector> &mat) { int m = mat.size(), n = mat[0].size(); // Matrice de mémoïzation vector> dp(n, vector(m, 0)); if(mat[0][0] == 1) // si la 1ère case n'est pas bloquée dp[0][0] = 1; // Programmation dynamique for(int i = 0; i < m; i++) { for(int j = 0; j < n; j++) { if(mat[i][j] == 0) // case bloquée : 0 manière { dp[i][j] = 0; } else // case libre { if(i > 0) // nombre de manières depuis la case du dessus dp[i][j] += dp[i - 1][j]; if(j > 0) // nombre de manières depuis la case de gauche dp[i][j] += dp[i][j - 1]; } } } return dp[m - 1][n - 1]; } // findWays() int main() { int m = 0, n = 0; cin >> m >> n; // lignes, colonnes vector> mat(m, vector(n, 0)); for(int i = 0; i < m; i++) for(int j = 0; j < n; j++) cin >> mat[i][j]; // 1 : libre, 0 : obstacle cout << findWays(mat) << '\n'; return 0; } // main()