|
@@ -9,6 +9,106 @@ func main() {
|
|
|
fmt.Scan(&N)
|
|
|
for cid := 0; cid < N; cid++ {
|
|
|
fmt.Scan(&L)
|
|
|
- fmt.Printf("Case #%d: \n", cid+1)
|
|
|
+ const sideLen = 6000
|
|
|
+ vert, hori := make([][]bool, sideLen), make([][]bool, sideLen+1)
|
|
|
+ for i := range vert {
|
|
|
+ vert[i] = make([]bool, sideLen+1)
|
|
|
+ }
|
|
|
+ for i := range hori {
|
|
|
+ hori[i] = make([]bool, sideLen)
|
|
|
+ }
|
|
|
+ x, y := 3000, 3000
|
|
|
+ detX, detY := 0, 1
|
|
|
+ xMin, xMax, yMin, yMax := Pair{3000, 3000}, Pair{3000, 3000}, Pair{3000, 3000}, Pair{3000, 3000}
|
|
|
+ // For detail explanation, please refer to https://code.google.com/codejam/contest/32002/dashboard#s=a&a=0
|
|
|
+ for i := 0; i < L; i++ {
|
|
|
+ var move string
|
|
|
+ var repeat int
|
|
|
+ fmt.Scan(&move, &repeat)
|
|
|
+ for r := 0; r < repeat; r++ {
|
|
|
+ for _, m := range move {
|
|
|
+ switch m {
|
|
|
+ case 'L':
|
|
|
+ detX, detY = -detY, detX
|
|
|
+ case 'R':
|
|
|
+ detX, detY = detY, -detX
|
|
|
+ case 'F':
|
|
|
+ if detY == 0 { // Move towards x dir
|
|
|
+ hori[y][(2*x+detX)/2] = true
|
|
|
+ } else { // ... y dir
|
|
|
+ vert[(2*y+detY)/2][x] = true
|
|
|
+ }
|
|
|
+ x, y = x+detX, y+detY
|
|
|
+ if x < xMin._1 || (xMin._1 == x && y < xMin._2) {
|
|
|
+ xMin._1, xMin._2 = x, y
|
|
|
+ }
|
|
|
+ if xMax._1 < x || (xMax._1 == x && xMax._2 < y) {
|
|
|
+ xMax._1, xMax._2 = x, y
|
|
|
+ }
|
|
|
+ if y < yMin._2 || (yMin._2 == y && yMin._1 < x) {
|
|
|
+ yMin._1, yMin._2 = x, y
|
|
|
+ }
|
|
|
+ if yMax._2 < y || (yMax._2 == y && x < yMax._1) {
|
|
|
+ yMax._1, yMax._2 = x, y
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } // Construct the edge graph and the position of 4 key points
|
|
|
+ // v____ <-- yMax
|
|
|
+ // __| |___v <-- xMax
|
|
|
+ // __| |
|
|
|
+ // | |
|
|
|
+ // |____ __|
|
|
|
+ // ^ | _| <-- xMin
|
|
|
+ // |____|
|
|
|
+ // ^ <-- yMin
|
|
|
+ polyArea := 0
|
|
|
+ for y := yMin._2; y < yMax._2; y++ {
|
|
|
+ cnt := 0
|
|
|
+ for x := xMin._1; x <= xMax._1; x++ {
|
|
|
+ if vert[y][x] {
|
|
|
+ cnt++
|
|
|
+ }
|
|
|
+ if cnt%2 == 1 { // Cross vert edge odd times: innner, even: outter
|
|
|
+ polyArea++
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ stairArea := 0
|
|
|
+ for x, hei := xMax._1-1, xMax._2; yMax._1 <= x; x-- {
|
|
|
+ for y := hei + 1; y <= yMax._2; y++ {
|
|
|
+ if hori[y][x] {
|
|
|
+ hei = y
|
|
|
+ }
|
|
|
+ }
|
|
|
+ stairArea += yMax._2 - hei
|
|
|
+ }
|
|
|
+ for y, hei := yMax._2-1, yMax._1; xMin._2 <= y; y-- {
|
|
|
+ for x := hei - 1; xMin._1 <= x; x-- {
|
|
|
+ if vert[y][x] {
|
|
|
+ hei = x
|
|
|
+ }
|
|
|
+ }
|
|
|
+ stairArea += hei - xMin._1
|
|
|
+ }
|
|
|
+ for x, hei := xMin._1, xMin._2; x < yMin._1; x++ {
|
|
|
+ for y := hei - 1; yMin._2 <= y; y-- {
|
|
|
+ if hori[y][x] {
|
|
|
+ hei = y
|
|
|
+ }
|
|
|
+ }
|
|
|
+ stairArea += hei - yMin._2
|
|
|
+ }
|
|
|
+ for y, hei := yMin._2, yMin._1; y < xMax._2; y++ {
|
|
|
+ for x := hei + 1; x <= xMax._1; x++ {
|
|
|
+ if vert[y][x] {
|
|
|
+ hei = x
|
|
|
+ }
|
|
|
+ }
|
|
|
+ stairArea += xMax._1 - hei
|
|
|
+ }
|
|
|
+ squareArea := (xMax._1 - xMin._1) * (yMax._2 - yMin._2)
|
|
|
+ fmt.Printf("Case #%d: %d\n", cid+1, squareArea-stairArea-polyArea)
|
|
|
}
|
|
|
}
|