|
| 1 | +""" |
| 2 | +A frog is crossing a river. The river is divided into x units and at each unit there may or may not exist a stone. The |
| 3 | +frog can jump on a stone, but it must not jump into the water. |
| 4 | +
|
| 5 | +Given a list of stones' positions (in units) in sorted ascending order, determine if the frog is able to cross the river |
| 6 | +by landing on the last stone. Initially, the frog is on the first stone and assume the first jump must be 1 unit. |
| 7 | +
|
| 8 | +If the frog's last jump was k units, then its next jump must be either k - 1, k, or k + 1 units. Note that the frog can |
| 9 | +only jump in the forward direction. |
| 10 | +
|
| 11 | +Note: |
| 12 | +
|
| 13 | +The number of stones is >= 2 and is < 1,100. |
| 14 | +Each stone's position will be a non-negative integer < 231. |
| 15 | +The first stone's position is always 0. |
| 16 | +Example 1: |
| 17 | +
|
| 18 | +[0,1,3,5,6,8,12,17] |
| 19 | +
|
| 20 | +There are a total of 8 stones. |
| 21 | +The first stone at the 0th unit, second stone at the 1st unit, |
| 22 | +third stone at the 3rd unit, and so on... |
| 23 | +The last stone at the 17th unit. |
| 24 | +
|
| 25 | +Return true. The frog can jump to the last stone by jumping |
| 26 | +1 unit to the 2nd stone, then 2 units to the 3rd stone, then |
| 27 | +2 units to the 4th stone, then 3 units to the 6th stone, |
| 28 | +4 units to the 7th stone, and 5 units to the 8th stone. |
| 29 | +Example 2: |
| 30 | +
|
| 31 | +[0,1,2,3,4,8,9,11] |
| 32 | +
|
| 33 | +Return false. There is no way to jump to the last stone as |
| 34 | +the gap between the 5th and 6th stone is too large. |
| 35 | +""" |
| 36 | +__author__ = 'Daniel' |
| 37 | + |
| 38 | + |
| 39 | +class Solution(object): |
| 40 | + def canCross(self, stones): |
| 41 | + """ |
| 42 | + F, step table |
| 43 | + Let F[i] be stone at position i, |
| 44 | +
|
| 45 | + dp with a set as the table cell. |
| 46 | + :type stones: List[int] |
| 47 | + :rtype: bool |
| 48 | + """ |
| 49 | + F = {} |
| 50 | + for stone in stones: |
| 51 | + F[stone] = set() |
| 52 | + |
| 53 | + F[0].add(0) |
| 54 | + for stone in stones: |
| 55 | + for step in F[stone]: |
| 56 | + for i in (-1, 0, 1): |
| 57 | + nxt = stone+step+i |
| 58 | + if nxt != stone and nxt in F: |
| 59 | + F[nxt].add(step+i) |
| 60 | + |
| 61 | + return True if F[stones[-1]] else False |
| 62 | + |
| 63 | + |
| 64 | +if __name__ == "__main__": |
| 65 | + assert Solution().canCross([0, 2]) == False |
| 66 | + assert Solution().canCross([0, 1, 3, 5, 6, 8, 12, 17]) == True |
| 67 | + assert Solution().canCross([0, 1, 2, 3, 4, 8, 9, 11]) == False |
0 commit comments