403.frog-jump.go 824 B

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. func canCross(stones []int) bool {
  2. n := len(stones)
  3. if n == 1 {
  4. return true
  5. } else if n == 0 || stones[1] != 1 {
  6. return false
  7. }
  8. m := make(map[int]bool)
  9. for i := 1; i < n; i++ {
  10. if 2*stones[i-1]+1 < stones[i] {
  11. return false // Pruning when the gap is too large.
  12. }
  13. m[stones[i]] = true
  14. }
  15. return dfs(m, stones[n-1], 1, 1)
  16. }
  17. func dfs(m map[int]bool, end, pos, jump int) bool {
  18. if pos+jump+1 == end || pos+jump == end || pos+jump-1 == end {
  19. return true
  20. }
  21. if _, ok := m[pos+jump+1]; ok {
  22. if dfs(m, end, pos+jump+1, jump+1) {
  23. return true
  24. }
  25. }
  26. if _, ok := m[pos+jump]; ok {
  27. if dfs(m, end, pos+jump, jump) {
  28. return true
  29. }
  30. }
  31. if jump == 1 { // 0 is not valid
  32. return false
  33. } else if _, ok := m[pos+jump-1]; ok {
  34. if dfs(m, end, pos+jump-1, jump-1) {
  35. return true
  36. }
  37. }
  38. return false
  39. }