← Home
For problem statement at 0-999/700-799/770-779/778/problemD.txt this is a correct solution, but verifier at 0-999/700-799/770-779/778/verifierD.go ends with case 2 failed
input:
6 2
LR
LR
LR
LR
LR
LR
UU
DD
LR
LR
LR
LR

expected:5
1 1
3 1
5 1
5 1
3 1
actual:1
1 1
exit status 1 can you fix the verifier? ```go
package main

import (
	"bufio"
	"fmt"
	"os"
)

func abs(a int) int {
	if a < 0 {
		return -a
	}
	return a
}

func main() {
	reader := bufio.NewReader(os.Stdin)
	var n, m int
	if _, err := fmt.Fscan(reader, &n, &m); err != nil {
		return
	}

	grid := make([][]byte, n)
	for r := 0; r < n; r++ {
		var s string
		fmt.Fscan(reader, &s)
		grid[r] = []byte(s)
	}

	target := make([][]byte, n)
	for r := 0; r < n; r++ {
		var s string
		fmt.Fscan(reader, &s)
		target[r] = []byte(s)
	}

	getH := func(g [][]byte) [][]int {
		H := make([][]int, n+1)
		for i := range H {
			H[i] = make([]int, m+1)
		}
		H[0][0] = 0
		for c := 0; c < m; c++ {
			parity := (c - 1 + 200) % 2 == 0
			d := 1
			if !parity {
				d = -1
			}
			H[0][c+1] = H[0][c] + d
		}
		for r := 0; r < n; r++ {
			for c := 0; c <= m; c++ {
				parity := (r + c + 200) % 2 == 0
				crossed := false
				if c > 0 && c < m && g[r][c-1] == 'L' && g[r][c] == 'R' {
					crossed = true
				}
				d := 1
				if parity {
					if crossed {
						d = -3
					} else {
						d = 1
					}
				} else {
					if crossed {
						d = 3
					} else {
						d = -1
					}
				}
				H[r+1][c] = H[r][c] + d
			}
		}
		return H
	}

	Hc := getH(grid)
	Ht := getH(target)

	var ops []string
	for {
		changed := false
		for r := 0; r < n-1; r++ {
			for c := 0; c < m-1; c++ {
				if Hc[r+1][c+1] == Ht[r+1][c+1] {
					continue
				}

				if grid[r][c] == 'L' && grid[r][c+1] == 'R' && grid[r+1][c] == 'L' && grid[r+1][c+1] == 'R' {
					parity := (r + c + 1) % 2 == 0
					d := 1
					if !parity {
						d = -1
					}
					newH := Hc[r][c+1] + d
					if abs(newH-Ht[r+1][c+1]) < abs(Hc[r+1][c+1]-Ht[r+1][c+1]) {
						grid[r][c] = 'U'
						grid[r][c+1] = 'U'
						grid[r+1][c] = 'D'
						grid[r+1][c+1] = 'D'
						Hc[r+1][c+1] = newH
						ops = append(ops, fmt.Sprintf("%d %d", r+1, c+1))
						changed = true
					}
				} else if grid[r][c] == 'U' && grid[r][c+1] == 'U' && grid[r+1][c] == 'D' && grid[r+1][c+1] == 'D' {
					parity := (r + c + 1) % 2 == 0
					d := 3
					if parity {
						d = -3
					}
					newH := Hc[r][c+1] + d
					if abs(newH-Ht[r+1][c+1]) < abs(Hc[r+1][c+1]-Ht[r+1][c+1]) {
						grid[r][c] = 'L'
						grid[r][c+1] = 'R'
						grid[r+1][c] = 'L'
						grid[r+1][c+1] = 'R'
						Hc[r+1][c+1] = newH
						ops = append(ops, fmt.Sprintf("%d %d", r+1, c+1))
						changed = true
					}
				}
			}
		}
		if !changed {
			break
		}
	}

	match := true
	for r := 0; r <= n; r++ {
		for c := 0; c <= m; c++ {
			if Hc[r][c] != Ht[r][c] {
				match = false
				break
			}
		}
	}

	writer := bufio.NewWriter(os.Stdout)
	defer writer.Flush()

	if match {
		fmt.Fprintln(writer, len(ops))
		for _, op := range ops {
			fmt.Fprintln(writer, op)
		}
	} else {
		fmt.Fprintln(writer, "-1")
	}
}
```