For problem statement at 1000-1999/1900-1999/1940-1949/1949/problemD.txt this is a correct solution, but verifier at 1000-1999/1900-1999/1940-1949/1949/verifierD.go ends with wrong answer on test 1
input:
4
SFSF
SSF?
FSFS
?SS?
expected:SFSF
SSFF
FSFS
?FS?
got:.FSF
S.FS
FS.S
FSS.
exit status 1 can you fix the verifier? package main
import (
"fmt"
)
var (
n int
K int
grid []string
color []int
adjF [][]int
adjS [][]int
found bool
ansA []int
)
func min(a, b int) int {
if a < b {
return a
}
return b
}
func dfsA(u int, c0 int, c1 int, kS int) {
if found {
return
}
if c0 > K+1 || c1 > K+1 {
return
}
if u == n {
if 2*min(c0, c1)+kS <= K {
found = true
ansA = make([]int, n)
copy(ansA, color)
}
return
}
valid0 := true
kS_add0 := 0
for _, v := range adjF[u] {
if v < u && color[v] != 0 {
valid0 = false
break
}
}
if valid0 {
for _, v := range adjS[u] {
if v < u && color[v] == 0 {
kS_add0++
}
}
color[u] = 0
dfsA(u+1, c0+1, c1, kS+kS_add0)
}
if found {
return
}
valid1 := true
kS_add1 := 0
for _, v := range adjF[u] {
if v < u && color[v] != 1 {
valid1 = false
break
}
}
if valid1 {
for _, v := range adjS[u] {
if v < u && color[v] == 1 {
kS_add1++
}
}
color[u] = 1
dfsA(u+1, c0, c1+1, kS+kS_add1)
}
}
func dfsB(u int, c0 int, c1 int, kF int) {
if found {
return
}
if c0 > K+1 || c1 > K+1 {
return
}
if u == n {
if 2*min(c0, c1)+kF <= K {
found = true
ansA = make([]int, n)
copy(ansA, color)
}
return
}
valid0 := true
kF_add0 := 0
for _, v := range adjS[u] {
if v < u && color[v] != 0 {
valid0 = false
break
}
}
if valid0 {
for _, v := range adjF[u] {
if v < u && color[v] == 0 {
kF_add0++
}
}
color[u] = 0
dfsB(u+1, c0+1, c1, kF+kF_add0)
}
if found {
return
}
valid1 := true
kF_add1 := 0
for _, v := range adjS[u] {
if v < u && color[v] != 1 {
valid1 = false
break
}
}
if valid1 {
for _, v := range adjF[u] {
if v < u && color[v] == 1 {
kF_add1++
}
}
color[u] = 1
dfsB(u+1, c0, c1+1, kF+kF_add1)
}
}
func main() {
if _, err := fmt.Scan(&n); err != nil {
return
}
K = (3*n + 3) / 4
grid = make([]string, n)
for i := 0; i < n; i++ {
fmt.Scan(&grid[i])
}
adjF = make([][]int, n)
adjS = make([][]int, n)
for i := 0; i < n; i++ {
for j := 0; j < n; j++ {
if i == j {
continue
}
if grid[i][j] == 'F' {
adjF[i] = append(adjF[i], j)
} else if grid[i][j] == 'S' {
adjS[i] = append(adjS[i], j)
}
}
}
color = make([]int, n)
found = false
dfsA(0, 0, 0, 0)
mode := 'A'
if !found {
dfsB(0, 0, 0, 0)
mode = 'B'
}
for i := 0; i < n; i++ {
out := make([]byte, n)
for j := 0; j < n; j++ {
if i == j {
out[j] = '.'
} else {
if grid[i][j] != '?' {
out[j] = grid[i][j]
} else {
if mode == 'A' {
if ansA[i] == ansA[j] {
out[j] = 'F'
} else {
out[j] = 'S'
}
} else {
if ansA[i] == ansA[j] {
out[j] = 'S'
} else {
out[j] = 'F'
}
}
}
}
}
fmt.Println(string(out))
}
}