main.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. package main
  2. import (
  3. "fmt"
  4. )
  5. func main() {
  6. var N, L int
  7. fmt.Scan(&N)
  8. for cid := 0; cid < N; cid++ {
  9. fmt.Scan(&L)
  10. const sideLen = 6000
  11. vert, hori := make([][]bool, sideLen), make([][]bool, sideLen+1)
  12. for i := range vert {
  13. vert[i] = make([]bool, sideLen+1)
  14. }
  15. for i := range hori {
  16. hori[i] = make([]bool, sideLen)
  17. }
  18. x, y := 3000, 3000
  19. detX, detY := 0, 1
  20. xMin, xMax, yMin, yMax := Pair{3000, 3000}, Pair{3000, 3000}, Pair{3000, 3000}, Pair{3000, 3000}
  21. // For detail explanation, please refer to https://code.google.com/codejam/contest/32002/dashboard#s=a&a=0
  22. for i := 0; i < L; i++ {
  23. var move string
  24. var repeat int
  25. fmt.Scan(&move, &repeat)
  26. for r := 0; r < repeat; r++ {
  27. for _, m := range move {
  28. switch m {
  29. case 'L':
  30. detX, detY = -detY, detX
  31. case 'R':
  32. detX, detY = detY, -detX
  33. case 'F':
  34. if detY == 0 { // Move towards x dir
  35. hori[y][(2*x+detX)/2] = true
  36. } else { // ... y dir
  37. vert[(2*y+detY)/2][x] = true
  38. }
  39. x, y = x+detX, y+detY
  40. if x < xMin._1 || (xMin._1 == x && y < xMin._2) {
  41. xMin._1, xMin._2 = x, y
  42. }
  43. if xMax._1 < x || (xMax._1 == x && xMax._2 < y) {
  44. xMax._1, xMax._2 = x, y
  45. }
  46. if y < yMin._2 || (yMin._2 == y && yMin._1 < x) {
  47. yMin._1, yMin._2 = x, y
  48. }
  49. if yMax._2 < y || (yMax._2 == y && x < yMax._1) {
  50. yMax._1, yMax._2 = x, y
  51. }
  52. }
  53. }
  54. }
  55. } // Construct the edge graph and the position of 4 key points
  56. // v____ <-- yMax
  57. // __| |___v <-- xMax
  58. // __| |
  59. // | |
  60. // |____ __|
  61. // ^ | _| <-- xMin
  62. // |____|
  63. // ^ <-- yMin
  64. polyArea := 0
  65. for y := yMin._2; y < yMax._2; y++ {
  66. cnt := 0
  67. for x := xMin._1; x <= xMax._1; x++ {
  68. if vert[y][x] {
  69. cnt++
  70. }
  71. if cnt%2 == 1 { // Cross vert edge odd times: innner, even: outter
  72. polyArea++
  73. }
  74. }
  75. }
  76. stairArea := 0
  77. for x, hei := xMax._1-1, xMax._2; yMax._1 <= x; x-- {
  78. for y := hei + 1; y <= yMax._2; y++ {
  79. if hori[y][x] {
  80. hei = y
  81. }
  82. }
  83. stairArea += yMax._2 - hei
  84. }
  85. for y, hei := yMax._2-1, yMax._1; xMin._2 <= y; y-- {
  86. for x := hei - 1; xMin._1 <= x; x-- {
  87. if vert[y][x] {
  88. hei = x
  89. }
  90. }
  91. stairArea += hei - xMin._1
  92. }
  93. for x, hei := xMin._1, xMin._2; x < yMin._1; x++ {
  94. for y := hei - 1; yMin._2 <= y; y-- {
  95. if hori[y][x] {
  96. hei = y
  97. }
  98. }
  99. stairArea += hei - yMin._2
  100. }
  101. for y, hei := yMin._2, yMin._1; y < xMax._2; y++ {
  102. for x := hei + 1; x <= xMax._1; x++ {
  103. if vert[y][x] {
  104. hei = x
  105. }
  106. }
  107. stairArea += xMax._1 - hei
  108. }
  109. squareArea := (xMax._1 - xMin._1) * (yMax._2 - yMin._2)
  110. fmt.Printf("Case #%d: %d\n", cid+1, squareArea-stairArea-polyArea)
  111. }
  112. }