| 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
 
- }
 
 
  |