123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114 |
- package main
- import (
- "fmt"
- )
- func main() {
- var N, L int
- fmt.Scan(&N)
- for cid := 0; cid < N; cid++ {
- fmt.Scan(&L)
- 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)
- }
- }
|