679.24-game.go 824 B

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. const eps = 0.000001
  2. func judgePoint24(nums []int) bool {
  3. list := make([]float64, len(nums))
  4. for i := range nums {
  5. list[i] = float64(nums[i])
  6. }
  7. return dfs(list)
  8. }
  9. func dfs(nums []float64) bool {
  10. l := len(nums)
  11. if l == 1 && math.Abs(nums[0]-24.0) <= eps {
  12. return true
  13. }
  14. for i := 0; i < l-1; i++ {
  15. for j := i + 1; j < l; j++ {
  16. next := make([]float64, l-2)
  17. for k, idx := 0, 0; k < l; k++ {
  18. if k == i || k == j {
  19. continue
  20. }
  21. next[idx], idx = nums[k], idx+1
  22. }
  23. p, q := nums[i], nums[j]
  24. tmp := []float64{p + q, p - q, q - p, p * q}
  25. if eps <= q {
  26. tmp = append(tmp, p/q)
  27. }
  28. if eps <= p {
  29. tmp = append(tmp, q/p)
  30. }
  31. for _, t := range tmp {
  32. next = append(next, t)
  33. if dfs(next) {
  34. return true
  35. }
  36. next = next[:len(next)-1]
  37. }
  38. }
  39. }
  40. return false
  41. }