488.zuma-game.go 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. type pair struct { // The presentation of the board is the key!
  2. _1 rune
  3. _2 int
  4. }
  5. const INF int = 1e9
  6. func findMinStep(board string, hand string) int {
  7. li := list.New()
  8. n := len(board)
  9. runes := []rune(board)
  10. prev := pair{runes[0], 1}
  11. for i := 1; i < n; i++ {
  12. if runes[i] == prev._1 {
  13. prev._2++
  14. } else {
  15. li.PushBack(prev)
  16. prev = pair{runes[i], 1}
  17. }
  18. }
  19. li.PushBack(prev)
  20. m := make(map[rune]int)
  21. for _, r := range hand {
  22. m[r]++
  23. }
  24. // R, Y, B, G, W
  25. if min := dfs(li, &m); min == INF {
  26. return -1
  27. } else {
  28. return min
  29. }
  30. }
  31. func dfs(li *list.List, m *map[rune]int) int {
  32. clearBoard(li)
  33. if li.Len() == 0 {
  34. return 0
  35. } else if len(*m) == 0 {
  36. return INF
  37. }
  38. min := INF
  39. for it := li.Front(); it != nil; it = it.Next() {
  40. p := it.Value.(pair)
  41. if cnt, ok := (*m)[p._1]; ok && 3 <= cnt+p._2 {
  42. need := 3 - p._2
  43. p._2 = 3
  44. it.Value = p
  45. (*m)[p._1] = cnt - need
  46. if cnt == need {
  47. delete(*m, p._1)
  48. }
  49. nli := list.New()
  50. nli.PushBackList(li)
  51. ret := dfs(nli, m) + need
  52. if ret < min {
  53. min = ret
  54. }
  55. p._2 -= need
  56. it.Value = p
  57. (*m)[p._1] = cnt
  58. }
  59. }
  60. return min
  61. }
  62. func clearBoard(li *list.List) {
  63. it := li.Front()
  64. for it != nil {
  65. if nxt := it.Next(); nxt != nil && nxt.Value.(pair)._1 == it.Value.(pair)._1 {
  66. p := pair{it.Value.(pair)._1, it.Value.(pair)._2 + nxt.Value.(pair)._2}
  67. it.Value = p
  68. li.Remove(nxt)
  69. } else if 3 <= it.Value.(pair)._2 {
  70. pre := it.Prev()
  71. li.Remove(it)
  72. if pre != nil {
  73. it = pre
  74. } else {
  75. it = nxt
  76. }
  77. } else {
  78. it = nxt
  79. }
  80. }
  81. }