Skip to content

Welcome to Tech by Example

Menu
  • Home
  • Posts
  • System Design Questions
Menu

Rotting Oranges Program

Posted on July 17, 2022July 17, 2022 by admin

Overview

An m*n matrix is given where each entry contains three values

  • 0 – Denotes that entry is empty
  • 1 – Denotes that entry contains fresh orange
  • 2 – Denotes that the entry contains rotten orange

A rotten orange will rot the neighboring orange in 1 day. For a given orange, any orange which lies on top, bottom, left and right is a neighboring orange. Diagonal oranges are not counted

The objective is to find the number of days when all the oranges will be rotten. Written -1 if all oranges cannot be rotten. This will happen if a fresh orange is unreachable from a rotten orange

Example 1

Input: [[2,1,1],[1,1,0],[0,1,1]]
Output: 4

There is one rotten orange at the top. It will rotten its neighboring two oranges. Those rotten neighboring orange will further rotten their neighboring oranges.

Example 2

Input: [[1,1]]
Output: -1

Program

Below is the program for the same

package main

import "fmt"

func orangesRotting(grid [][]int) int {
	numRows := len(grid)
	numColumns := len(grid[0])

	queue := make([][2]int, 0)

	for i := 0; i < numRows; i++ {
		for j := 0; j < numColumns; j++ {
			if grid[i][j] == 2 {
				queue = append(queue, [2]int{i, j})
			}
		}
	}

	neighboursIndex := [][2]int{{1, 0}, {-1, 0}, {0, 1}, {0, -1}}
	numMinutes := 0
	for {
		n := len(queue)
		for i := 0; i < n; i++ {
			pop := queue[0]
			queue = queue[1:]

			a := pop[0]
			b := pop[1]
			for k := 0; k < 4; k++ {
				neighbourX := a + neighboursIndex[k][0]
				neighbourY := b + neighboursIndex[k][1]

				if isValid(neighbourX, neighbourY, numRows, numColumns) {
					if grid[neighbourX][neighbourY] == 1 {
						grid[neighbourX][neighbourY] = 2
						queue = append(queue, [2]int{neighbourX, neighbourY})
					}
				}

			}
		}

		if len(queue) == 0 {
			break
		}
		numMinutes++
	}

	for i := 0; i < numRows; i++ {
		for j := 0; j < numColumns; j++ {
			if grid[i][j] == 1 {
				return -1
			}
		}
	}

	return numMinutes
}

func isValid(i, j, numRows, numColumns int) bool {
	if i >= numRows || i < 0 {
		return false
	}

	if j >= numColumns || j < 0 {
		return false
	}
	return true
}

func main() {
	output := orangesRotting([][]int{{2, 1, 1}, {1, 1, 0}, {0, 1, 1}})
	fmt.Println(output)

	output = orangesRotting([][]int{{1, 1}})
	fmt.Println(output)
}

Output:

4
-1

Also, check out our system design tutorial series here – System Design Tutorial Series

©2025 Welcome to Tech by Example | Design: Newspaperly WordPress Theme