- Notifications
You must be signed in to change notification settings - Fork 4
/
Copy path0994-rotting-oranges.rb
89 lines (71 loc) · 2.15 KB
/
0994-rotting-oranges.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
# frozen_string_literal: true
# 994. Rotting Oranges
# https://leetcode.com/problems/rotting-oranges
# Medium
=begin
You are given an m x n grid where each cell can have one of three values:
0 representing an empty cell,
1 representing a fresh orange, or
2 representing a rotten orange.
Every minute, any fresh orange that is 4-directionally adjacent to a rotten orange becomes rotten.
Return the minimum number of minutes that must elapse until no cell has a fresh orange. If this is impossible, return -1.
### Example 1:
Input: grid = [[2,1,1],[1,1,0],[0,1,1]]
Output: 4
### Example 2:
Input: grid = [[2,1,1],[0,1,1],[1,0,1]]
Output: -1
Explanation: The orange in the bottom left corner (row 2, column 0) is never rotten, because rotting only happens 4-directionally.
### Example 3:
Input: grid = [[0,2]]
Output: 0
Explanation: Since there are already no fresh oranges at minute 0, the answer is just 0.
### Constraints:
* m == grid.length
* n == grid[i].length
* 1 <= m, n <= 10
* grid[i][j] is 0, 1, or 2.
=end
# @param {Integer[][]} grid
# @return {Integer}
deforanges_rotting(grid)
row_count=grid.count
column_count=grid[0].count
queue=[]
fresh_count=0
row_count.timesdo |i|
column_count.timesdo |j|
queue << [i,j]ifgrid[i][j] == 2
fresh_count += 1ifgrid[i][j] == 1
end
end
directions=[[1,0],[-1,0],[0,1],[0, -1]]
level=0
while !queue.empty?
level += 1
queue.count.timesdo
i,j=queue.shift
directions.eachdo |d_i,d_j|
if(0...row_count).cover?(i + d_i) &&
(0...column_count).cover?(j + d_j) &&
grid[i + d_i][j + d_j] == 1
fresh_count -= 1
grid[i + d_i][j + d_j]=2
queue << [i + d_i,j + d_j]
end
end
end
end
fresh_count != 0 ? -1 : [level - 1,0].max
end
# **************** #
# TEST #
# **************** #
require"test/unit"
classTest_oranges_rotting < Test::Unit::TestCase
deftest_
assert_equal(4,oranges_rotting([[2,1,1],[1,1,0],[0,1,1]]))
assert_equal(-1,oranges_rotting([[2,1,1],[0,1,1],[1,0,1]]))
assert_equal(0,oranges_rotting([[0,2]]))
end
end