// Tous les chemins du haut-gauche au bas-droite avec déplacements en 4-voisinage. // Version récursive (DFS). #include #include using namespace std; // Tous les chemins possibles de i à j void printAllPaths(const vector> &mat, vector> &visited, const int i, const int j, vector res = {}) { int m = mat.size(), n = mat[0].size(); // Vérifier si la case est valide if(i < 0 || j < 0 || i >= m || j >= n || visited[i][j] == true) return; if(i == m - 1 && j == n - 1) // destination atteinte ! { res.push_back(mat[i][j]); // ajouter la valeur de la case bottom-right // Afficher le chemin for(size_t k = 0; k < res.size(); k++) cout << res[k] << ' '; cout << '\n'; return; } visited[i][j] = true; // marquer {i,j} comme visitée res.push_back(mat[i][j]); // ajouter {i,j} au chemin printAllPaths(mat, visited, i, j + 1, res); // aller à droite récursivement printAllPaths(mat, visited, i + 1, j, res); // aller en bas récursivement printAllPaths(mat, visited, i - 1, j, res); // aller en haut récursivement printAllPaths(mat, visited, i, j - 1, res); // aller à gauche récursivement // BACKTRACK : on retire {i,j} du chemin et on "dévisite" res.pop_back(); visited[i][j] = false; } // printAllPaths() int main() { int m = 0, n = 0; cin >> m >> n; // lignes, colonnes auto graphe = vector>(m, vector(n, 0)); for(int i = 0; i < m; i++) for(int j = 0; j < n; j++) cin >> graphe[i][j]; auto visites = vector>(m, vector(n, false)); printAllPaths(graphe, visites, 0, 0); return 0; } // main()