// Plus court chemin entre deux cellules. // Version "DFS" - parcours en profondeur #include using namespace std; const int Infini = numeric_limits::max(); // Vérification si (i, j) est une cellule valide ou non bool isSafe(const vector> &mat, const vector> &visited, int x, int y) { int m = mat.size(), n = mat[0].size(); return x >= 0 && x < m && y >= 0 && y < n && mat[x][y] == 1 && !visited[x][y]; } // isSafe() // Distance la plus courte entre une cellule (i, j) et une cellule (x, y) // Parcours en profondeur void findShortestPath(const vector> &mat, vector> &visited, int i, int j, int x, int y, int &min_dist, int dist) { if(i == x && j == y) // Destination atteinte { min_dist = min(dist, min_dist); return; } // Marquer (i, j) comme visitée visited[i][j] = true; // Appel récursif sur la case du bas if(isSafe(mat, visited, i + 1, j)) findShortestPath(mat, visited, i + 1, j, x, y, min_dist, dist + 1); // Appel récursif sur la case de droite if(isSafe(mat, visited, i, j + 1)) findShortestPath(mat, visited, i, j + 1, x, y, min_dist, dist + 1); // Appel récursif sur la case du haut if(isSafe(mat, visited, i - 1, j)) findShortestPath(mat, visited, i - 1, j, x, y, min_dist, dist + 1); // Appel récursif sur la case de gauche if(isSafe(mat, visited, i, j - 1)) findShortestPath(mat, visited, i, j - 1, x, y, min_dist, dist + 1); // Backtrack: marquer (i, j) comme non visitée visited[i][j] = false; } //findShortestPath() // Fonction appelée du main() qui appelle la fonction récursive findShortestPath() int findShortestPathLength(const vector> &mat, pair &src, pair &dest) { if(mat.size() == 0 || mat[src.first][src.second] == 0 || mat[dest.first][dest.second] == 0) return -1; int m = mat.size(); int n = mat[0].size(); // Matrice m × n pour mémoriser les cellules visitées auto visited = vector>(m, vector(n, false)); int dist = Infini; findShortestPath(mat, visited, src.first, src.second, dest.first, dest.second, dist, 0); return (dist != Infini) ? dist : -1; } // findShortestPathLength() int main() { // Lecture des données int m = 0, n = 0; cin >> m >> n; auto mat = vector>(m, vector(n, 0)); for(int i = 0; i < m * n; i++) cin >> mat[i / n][i % n]; // Résolution pair src = make_pair(0, 0); pair dst = make_pair(m - 1, n - 1); int dist = findShortestPathLength(mat, src, dst); if(dist != -1) cout << dist << '\n'; else cout << "No solution.\n"; return 0; } // main()