← Home
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)
}