```go
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
type Pos struct{ r, c int }
var moves = []Pos{
{1, 2}, {1, -2}, {-1, 2}, {-1, -2},
{2, 1}, {2, -1}, {-2, 1}, {-2, -1},
}
func bfs(n, m, tr, tc int) [][]int {
dist := make([][]int, n+1)
for i := 0; i <= n; i++ {
dist[i] = make([]int, m+1)
for j := 0; j <= m; j++ {
dist[i][j] = 1e9
}
}
q := []Pos{{tr, tc}}
dist[tr][tc] = 0
head := 0
for head < len(q) {
curr := q[head]
head++
for _, mv := range moves {
nr, nc := curr.r+mv.r, curr.c+mv.c
if nr >= 1 && nr <= n && nc >= 1 && nc <= m {
if dist[nr][nc] == 1e9 {
dist[nr][nc] = dist[curr.r][curr.c] + 1
q = append(q, Pos{nr, nc})
}
}
}
}
return dist
}
func isKnightMove(r1, c1, r2, c2 int) bool {
dr := r1 - r2
if dr < 0 {
dr = -dr
}
dc := c1 - c2
if dc < 0 {
dc = -dc
}
return (dr == 1 && dc == 2) || (dr == 2 && dc == 1)
}
func main() {
reader := bufio.NewReader(os.Stdin)
var allTokens []string
for {
line, err := reader.ReadString('\n')
if err != nil && len(strings.TrimSpace(line)) == 0 {
return
}
fields := strings.Fields(line)
if len(fields) > 0 {
if len(fields) == 1 {
} else {
allTokens = append(allTokens, fields...)
}
break
}
}
nextToken := func() (string, bool) {
if len(allTokens) > 0 {
tok := allTokens[0]
allTokens = allTokens[1:]
return tok, true
}
for {
line, err := reader.ReadString('\n')
if err != nil && len(strings.TrimSpace(line)) == 0 {
return "", false
}
parts := strings.Fields(line)
if len(parts) > 0 {
allTokens = append(allTokens, parts...)
tok := allTokens[0]
allTokens = allTokens[1:]
return tok, true
}
}
}
readInt := func() (int, bool) {
tok, ok := nextToken()
if !ok {
return 0, false
}
v, _ := strconv.Atoi(tok)
return v, true
}
for {
n, ok := readInt()
if !ok {
break
}
m, _ := readInt()
x1, _ := readInt()
y1, _ := readInt()
x2, _ := readInt()
y2, _ := readInt()
tw_r, tw_c := n/2, m/2
tb_r, tb_c := n/2+1, m/2
distW := bfs(n, m, tw_r, tw_c)
distB := bfs(n, m, tb_r, tb_c)
dW := distW[x1][y1]
dB := distB[x2][y2]
pW := (x1 + y1) % 2
pB := (x2 + y2) % 2
var myColor string
if pW != pB {
if dW <= dB {
myColor = "WHITE"
} else {
myColor = "BLACK"
}
} else {
if dB <= dW-1 {
myColor = "BLACK"
} else {
myColor = "WHITE"
}
}
fmt.Println(myColor)
var myR, myC, oppR, oppC int
if myColor == "WHITE" {
myR, myC = x1, y1
oppR, oppC = x2, y2
} else {
myR, myC = x2, y2
oppR, oppC = x1, y1
}
myTurn := (myColor == "WHITE")
targetR, targetC := tw_r, tw_c
myDist := distW
if myColor == "BLACK" {
targetR, targetC = tb_r, tb_c
myDist = distB
}
for {
if myR == oppR && myC == oppC {
break
}
if myR == targetR && myC == targetC && !isKnightMove(myR, myC, oppR, oppC) {
break
}
if myTurn {
nextR, nextC := -1, -1
if isKnightMove(myR, myC, oppR, oppC) {
nextR, nextC = oppR, oppC
} else {
minD := 1000000000
maxDistToOpp := -1
for _, mv := range moves {
nr, nc := myR+mv.r, myC+mv.c
if nr >= 1 && nr <= n && nc >= 1 && nc <= m {
if !isKnightMove(nr, nc, oppR, oppC) {
d := myDist[nr][nc]
distToOppSq := (nr-oppR)*(nr-oppR) + (nc-oppC)*(nc-oppC)
if d < minD || (d == minD && distToOppSq > maxDistToOpp) {
minD = d
maxDistToOpp = distToOppSq
nextR, nextC = nr, nc
}
}
}
}
if nextR == -1 {
for _, mv := range moves {
nr, nc := myR+mv.r, myC+mv.c
if nr >= 1 && nr <= n && nc >= 1 && nc <= m {
nextR, nextC = nr, nc
break
}
}
}
}
fmt.Printf("%d %d\n", nextR, nextC)
myR, myC = nextR, nextC
if myR == oppR && myC == oppC {
break
}
if myR == targetR && myC == targetC && !isKnightMove(myR, myC, oppR, oppC) {
break
}
} else {
r, ok := readInt()
if !ok {
return
}
c, _ := readInt()
if r == -1 && c == -1 {
return
}
oppR, oppC = r, c
if oppR == myR && oppC == myC {
break
}
oppTargetR, oppTargetC := tb_r, tb_c
if myColor == "BLACK" {
oppTargetR, oppTargetC = tw_r, tw_c
}
if oppR == oppTargetR && oppC == oppTargetC && !isKnightMove(oppR, oppC, myR, myC) {
break
}
}
myTurn = !myTurn
}
}
}
```