1234567891011121314151617181920212223242526272829303132333435363738394041 |
- func canCross(stones []int) bool {
- n := len(stones)
- if n == 1 {
- return true
- } else if n == 0 || stones[1] != 1 {
- return false
- }
- m := make(map[int]bool)
- for i := 1; i < n; i++ {
- if 2*stones[i-1]+1 < stones[i] {
- return false // Pruning when the gap is too large.
- }
- m[stones[i]] = true
- }
- return dfs(m, stones[n-1], 1, 1)
- }
- func dfs(m map[int]bool, end, pos, jump int) bool {
- if pos+jump+1 == end || pos+jump == end || pos+jump-1 == end {
- return true
- }
- if _, ok := m[pos+jump+1]; ok {
- if dfs(m, end, pos+jump+1, jump+1) {
- return true
- }
- }
- if _, ok := m[pos+jump]; ok {
- if dfs(m, end, pos+jump, jump) {
- return true
- }
- }
- if jump == 1 { // 0 is not valid
- return false
- } else if _, ok := m[pos+jump-1]; ok {
- if dfs(m, end, pos+jump-1, jump-1) {
- return true
- }
- }
- return false
- }
|