For problem statement at 0-999/300-399/340-349/342/problemD.txt this is a correct solution, but verifier at 0-999/300-399/340-349/342/verifierD.go ends with All tests passed can you fix the verifier? package main
import (
"fmt"
)
const MOD = 1000000007
type Move struct {
r1, c1, r2, c2 int
}
func getTransitions(empty int) []int {
switch empty {
case 0:
return []int{0}
case 1:
return []int{1}
case 2:
return []int{2}
case 3:
return []int{0, 3}
case 4:
return []int{4}
case 5:
return []int{5}
case 6:
return []int{0, 6}
case 7:
return []int{1, 4, 7}
}
return nil
}
func countTilings(grid [][]byte, n int) int {
dp := make([]int, 8)
dp[0] = 1
for c := 0; c < n; c++ {
blocked := 0
for r := 0; r < 3; r++ {
if grid[r][c] == 'X' {
blocked |= (1 << r)
}
}
newDp := make([]int, 8)
for mask := 0; mask < 8; mask++ {
if dp[mask] == 0 {
continue
}
if (mask & blocked) != 0 {
continue
}
empty := (^(mask | blocked)) & 7
for _, nextMask := range getTransitions(empty) {
newDp[nextMask] = (newDp[nextMask] + dp[mask]) % MOD
}
}
dp = newDp
}
return dp[0]
}
func main() {
var n int
if _, err := fmt.Scan(&n); err != nil {
return
}
grid := make([][]byte, 3)
for i := 0; i < 3; i++ {
var s string
fmt.Scan(&s)
grid[i] = []byte(s)
}
rO, cO := -1, -1
for r := 0; r < 3; r++ {
for c := 0; c < n; c++ {
if grid[r][c] == 'O' {
rO, cO = r, c
}
}
}
var possibleMoves []Move
if cO >= 2 && grid[rO][cO-1] == '.' && grid[rO][cO-2] == '.' {
possibleMoves = append(possibleMoves, Move{rO, cO - 1, rO, cO - 2})
}
if cO <= n-3 && grid[rO][cO+1] == '.' && grid[rO][cO+2] == '.' {
possibleMoves = append(possibleMoves, Move{rO, cO + 1, rO, cO + 2})
}
if rO == 2 && grid[rO-1][cO] == '.' && grid[rO-2][cO] == '.' {
possibleMoves = append(possibleMoves, Move{rO - 1, cO, rO - 2, cO})
}
if rO == 0 && grid[rO+1][cO] == '.' && grid[rO+2][cO] == '.' {
possibleMoves = append(possibleMoves, Move{rO + 1, cO, rO + 2, cO})
}
ans := 0
numMoves := len(possibleMoves)
for mask := 1; mask < (1<<numMoves); mask++ {
tempGrid := make([][]byte, 3)
for i := 0; i < 3; i++ {
tempGrid[i] = make([]byte, n)
copy(tempGrid[i], grid[i])
}
tempGrid[rO][cO] = 'X'
bits := 0
for i := 0; i < numMoves; i++ {
if (mask & (1 << i)) != 0 {
m := possibleMoves[i]
tempGrid[m.r1][m.c1] = 'X'
tempGrid[m.r2][m.c2] = 'X'
bits++
}
}
ways := countTilings(tempGrid, n)
if bits%2 == 1 {
ans = (ans + ways) % MOD
} else {
ans = (ans - ways + MOD) % MOD
}
}
fmt.Println(ans)
}