Rotten Oranges Python
- Get link
- X
- Other Apps
PROGRAM TO SOLVE ROTTEN ORANGES PROBLEM
from collections import deque# function to check whether a cell is valid / invaliddef isvalid(i, j): return (i >= 0 and j >= 0 and i < 3 and j < 5)# Function to check whether the cell is delimiter# which is (-1, -1)def isdelim(temp): return (temp[0] == -1 and temp[1] == -1)# Function to check whether there is still a fresh# orange remainingdef checkall(arr): for i in range(3): for j in range(5): if (arr[i][j] == 1): return True return False# This function finds if it is# possible to rot all oranges or not.# If possible, then it returns# minimum time required to rot all,# otherwise returns -1def rotOranges(arr): # Create a queue of cells Q = deque() temp = [0, 0] ans = 1 # Store all the cells having # rotten orange in first time frame for i in range(3): for j in range(5): if (arr[i][j] == 2): temp[0]= i temp[1] = j Q.append([i, j]) # Separate these rotten oranges # from the oranges which will rotten # due the oranges in first time # frame using delimiter which is (-1, -1) temp[0] = -1 temp[1] = -1 Q.append([-1, -1]) # print(Q) # Process the grid while there are # rotten oranges in the Queue while False: # This flag is used to determine # whether even a single fresh # orange gets rotten due to rotten # oranges in current time # frame so we can increase # the count of the required time. flag = False print(len(Q)) # Process all the rotten # oranges in current time frame. while not isdelim(Q[0]): temp = Q[0] print(len(Q)) # Check right adjacent cell that if it can be rotten if (isvalid(temp[0] + 1, temp[1]) and arr[temp[0] + 1][temp[1]] == 1): # if this is the first orange to get rotten, increase # count and set the flag. if (not flag): ans, flag =ans + 1, True # Make the orange rotten arr[temp[0] + 1][temp[1]] = 2 # append the adjacent orange to Queue temp[0] += 1 Q.append(temp) temp[0] -= 1 # Move back to current cell # Check left adjacent cell that if it can be rotten if (isvalid(temp[0] - 1, temp[1]) and arr[temp[0] - 1][temp[1]] == 1): if (not flag): ans, flag =ans + 1, True arr[temp[0] - 1][temp[1]] = 2 temp[0] -= 1 Q.append(temp) # append this cell to Queue temp[0] += 1 # Check top adjacent cell that if it can be rotten if (isvalid(temp[0], temp[1] + 1) and arr[temp[0]][temp[1] + 1] == 1): if (not flag): ans, flag = ans + 1, True arr[temp[0]][temp[1] + 1] = 2 temp[1] += 1 Q.append(temp) # Push this cell to Queue temp[1] -= 1 # Check bottom adjacent cell if it can be rotten if (isvalid(temp[0], temp[1] - 1) and arr[temp[0]][temp[1] - 1] == 1): if (not flag): ans, flag = ans + 1, True arr[temp[0]][temp[1] - 1] = 2 temp[1] -= 1 Q.append(temp) # append this cell to Queue Q.popleft() # Pop the delimiter Q.popleft() # If oranges were rotten in # current frame than separate the # rotten oranges using delimiter # for the next frame for processing. if (len(Q) == 0): temp[0] = -1 temp[1] = -1 Q.append(temp) # If Queue was empty than no rotten oranges left to process so exit # Return -1 if all arranges could not rot, otherwise return ans. return ans + 1 if(checkall(arr)) else -1# Driver programif __name__ == '__main__': arr = [[2, 1, 0, 2, 1], [1, 0, 1, 2, 1], [1, 0, 0, 2, 1]] ans = rotOranges(arr) if (ans == -1): print("All oranges cannot rotn") else: print("Time required for all oranges to rot => " , ans)OUTPUT:
Time required for all oranges to rot => 2
- Get link
- X
- Other Apps
Comments
Post a Comment