Given a matrix **mat[][]** with N rows and M columns. The task is to find the minimum number of changes required in the matrix such that every path from top left to bottom right is a palindromic path. In a path only right and bottom movements are allowed from one cell to another cell.

**Examples:**

Input:mat[][] = {{1, 2}, {3, 1}}

Output:0

Explanation:

Every path in the matrix from top left to bottom right is palindromic.

Paths => {1, 2, 1}, {1, 3, 1}

Input:mat[][] = {{1, 2}, {3, 5}}

Output:1

Explanation:

Only one change is required for the every path to be palindromic.

That is => mat[1][1] = 1

Paths => {1, 2, 1}, {1, 3, 1}

**Approach:** The key observation in the problem is that element at same distance from the front end or rear end are equal. Therefore, find all the elements at equal distance from (0, 0) and (N-1, M-1) and then make all of them equal in minimum number of changes. Maintain a count variable to get the total number of changes. Below is the illustration of the approach:

- Distance possible from the top left and bottom right is 0 to N + M – 2.
- Maintain two-pointers one at top left that is distance at 0 and another at N + M – 2.
- Iterate over the matrix and for all distance maintain a hash-map of the elements of the matrix at the current distance.
- Update the matrix elements with minimum number of changes required.
- Finally, increment the left distance by 1 and decrement the right distance by 1.

Below is the implementation of the above approach:

## C++

`// C++ implementation to find the ` `// minimum number of changes required ` `// such that every path from top left ` `// to the bottom right ` `// are palindromic paths ` ` ` `#include <bits/stdc++.h> ` `using` `namespace` `std; ` `#define M 3 ` `#define N 3 ` ` ` `// Function to find the minimum number ` `// of the changes required for the ` `// every path to be palindromic ` `int` `minchanges(` `int` `mat[N][M]) ` `{ ` ` ` `// count variable for ` ` ` `// maintaining total changes. ` ` ` `int` `count = 0; ` ` ` ` ` `// left and right variables for ` ` ` `// keeping distance values ` ` ` `// from cell(0, 0) and ` ` ` `// (N-1, M-1) respectively. ` ` ` `int` `left = 0, right = N + M - 2; ` ` ` ` ` `while` `(left < right) { ` ` ` ` ` `unordered_map<` `int` `, ` `int` `> mp; ` ` ` `int` `totalsize = 0; ` ` ` ` ` `// Iterating over the matrix ` ` ` `for` `(` `int` `i = 0; i < N; i++) { ` ` ` `for` `(` `int` `j = 0; j < M; j++) { ` ` ` `if` `(i + j == left) { ` ` ` `mp[mat[i][j]]++; ` ` ` `totalsize++; ` ` ` `} ` ` ` `else` `if` `(i + j == right) { ` ` ` `mp[mat[i][j]]++; ` ` ` `totalsize++; ` ` ` `} ` ` ` `} ` ` ` `} ` ` ` ` ` `// Finding minimum number ` ` ` `// of changes required. ` ` ` `unordered_map<` `int` `, ` ` ` `int` `>::iterator itr = mp.begin(); ` ` ` `int` `changes = 0; ` ` ` `for` `(; itr != mp.end(); itr++) ` ` ` `changes = max(changes, itr->second); ` ` ` ` ` `// Minimum no. of changes will ` ` ` `// be the the minimum no. ` ` ` `// of different values and ` ` ` `// we will assume to ` ` ` `// make them equals to value ` ` ` `// with maximum frequency element ` ` ` `count += totalsize - changes; ` ` ` ` ` `// Moving ahead with ` ` ` `// greater distance ` ` ` `left++; ` ` ` `right--; ` ` ` `} ` ` ` `return` `count; ` `} ` ` ` `// Driven Code ` `int` `main() ` `{ ` ` ` `int` `mat[][M] = { ` ` ` `{ 1, 4, 1 }, ` ` ` `{ 2, 5, 3 }, ` ` ` `{ 1, 3, 1 } ` ` ` `}; ` ` ` ` ` `cout << minchanges(mat); ` ` ` `return` `0; ` `} ` |

*chevron_right*

*filter_none*

**Output:**

2

**Performance Analysis:**

**Time Complexity:**O(N^{3})**Auxiliary Space:**O(N)

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the **DSA Self Paced Course** at a student-friendly price and become industry ready.

## Recommended Posts:

- Minimum steps to convert all paths in matrix from top left to bottom right as palindromic paths | Set 2
- Minimum steps to convert all top left to bottom right paths in Matrix as palindrome | Set 2
- Print all palindromic paths from top left to bottom right in a matrix
- Count all possible paths from top left to bottom right of a mXn matrix
- Print all possible paths from top left to bottom right of a mXn matrix
- Print all paths from top left to bottom right in a matrix with four moves allowed
- Count of palindromic plus paths in a given Matrix
- Number of palindromic paths in a matrix
- Number of shortest paths to reach every cell from bottom-left cell in the grid
- Minimum cost to reach from the top-left to the bottom-right corner of a matrix
- Minimum steps required to convert the matrix into lower hessenberg matrix
- Minimum number of steps to convert a given matrix into Diagonally Dominant Matrix
- Minimum number of steps to convert a given matrix into Upper Hessenberg matrix
- Minimum steps required to convert X to Y where a binary matrix represents the possible conversions
- Sum of cost of all paths to reach a given cell in a Matrix
- Total number of decreasing paths in a matrix
- Maths behind number of paths in matrix problem
- Paths from entry to exit in matrix and maximum path sum
- Maximum points from top left of matrix to bottom right and return back
- Lexicographically largest prime path from top-left to bottom-right in a matrix

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.