diff --git a/C++/Find_the_longest_path_in_a_matrix_with_given_constraints.cpp b/C++/Find_the_longest_path_in_a_matrix_with_given_constraints.cpp new file mode 100644 index 0000000..8020b4b --- /dev/null +++ b/C++/Find_the_longest_path_in_a_matrix_with_given_constraints.cpp @@ -0,0 +1,65 @@ +// C++ program to find the longest path in a matrix + +#include +#define n 3 +using namespace std; + + +int findLongestFromACell(int i, int j, int mat[n][n], + int dp[n][n]) +{ + if (i < 0 || i >= n || j < 0 || j >= n) + return 0; + + + if (dp[i][j] != -1) + return dp[i][j]; + + int x = INT_MIN, y = INT_MIN, z = INT_MIN, w = INT_MIN; + + if (j < n - 1 && ((mat[i][j] + 1) == mat[i][j + 1])) + x = 1 + findLongestFromACell(i, j + 1, mat, dp); + + if (j > 0 && (mat[i][j] + 1 == mat[i][j - 1])) + y = 1 + findLongestFromACell(i, j - 1, mat, dp); + + if (i > 0 && (mat[i][j] + 1 == mat[i - 1][j])) + z = 1 + findLongestFromACell(i - 1, j, mat, dp); + + if (i < n - 1 && (mat[i][j] + 1 == mat[i + 1][j])) + w = 1 + findLongestFromACell(i + 1, j, mat, dp); + + return dp[i][j] = max({x, y, z, w, 1}); +} + + +int finLongestOverAll(int mat[n][n]) +{ + int result = 1; // Initialize result + + + int dp[n][n]; + memset(dp, -1, sizeof dp); + + for (int i = 0; i < n; i++) { + for (int j = 0; j < n; j++) { + if (dp[i][j] == -1) + findLongestFromACell(i, j, mat, dp); + + // Update result if needed + result = max(result, dp[i][j]); + } + } + + return result; +} + + +int main() +{ + int mat[n][n] + = { { 1, 2, 9 }, { 5, 3, 8 }, { 4, 6, 7 } }; + cout << "Length of the longest path is " + << finLongestOverAll(mat); + return 0; +}