

Input: [[2,1,1],[1,1,0],[0,0,0]]
Output: 2
At T=0, only orange at (0,0) is rotten.
At T=1, oranges at (0,0),(0,1) and (1,0) are rotten.
At T=2, oranges at (0,0),(0,1),(1,0),(0,2) and (1,1) are rotten.
No fresh oranges are left after T=2.
The first line will contain the integer 'T', denoting the number of test cases.
The first line of each test case contains two single space-separated integers, 'N' and 'M', representing the grid's number of rows and columns, respectively.
The next 'N' lines contain 'M' single space-separated integers, each representing the rows of the grid.
The only line of output contains a single integer, i.e., The minimum time after which no cell has a fresh orange.
If it's impossible to rot all oranges, print -1.
You are not required to print the expected output. It has already been taken care of. Just implement the function.
1 <= N*M <= 10^5
0 <= grid[i][j] <= 2
Time Limit: 1 sec
The idea is elementary and naive. We will process the rotten oranges second by second. Each second, we rot all the fresh oranges adjacent to the rotten oranges. The time by which there are no rotten oranges left to process will be our minimum time.
In the first traversal of the grid, we will process all the cells with value 2 (rotten oranges). We will also mark their adjacent cells as rotten for the next traversal. Now, we can’t mark them by assigning the same value, i.e., two, because then we won’t be able to differentiate between the current processing cells and the cells processed in the next traversal. So, we will mark them as value 3. More formally, we will mark the adjacent cells as ‘CURR_ROTTEN’ + 1 in each grid traversal.
Here is the complete algorithm.
We can solve this problem by using Breadth-First-Search, similar to the level order traversal of a Binary Tree.
We will use a Queue data structure and insert cells into this Queue level by level. Here, all the already rotten oranges will be at level 0, all the fresh oranges adjacent to them will be at level 1, all the fresh oranges adjacent to level 1 oranges will be at level 2, and so on. The time to reach the last level will be our minimum time.
Here, is the complete algorithm-