package main import ( "bufio" "fmt" "os" "strconv" "strings" ) const INF = 1e9 type Node struct { r, c int } func main() { scanner := bufio.NewScanner(os.Stdin) scanner.Scan() parts := strings.Fields(scanner.Text()) n, _ := strconv.Atoi(parts[0]) m, _ := strconv.Atoi(parts[1]) r_start, _ := strconv.Atoi(parts[2]) c_start, _ := strconv.Atoi(parts[3]) r_start-- c_start-- // 0-indexed grid := make([]string, n) for i := 0; i < n; i++ { scanner.Scan() grid[i] = scanner.Text() } // Step 1: Multi-source BFS for solo phase dist_solo := make([][]int, n) for i := range dist_solo { dist_solo[i] = make([]int, m) for j := range dist_solo[i] { dist_solo[i][j] = -1 } } q_solo := make([]Node, 0) for i := 0; i < n; i++ { for j := 0; j < m; j++ { if grid[i][j] == '@' { dist_solo[i][j] = 0 q_solo = append(q_solo, Node{i, j}) } } } dr := []int{-1, 1, 0, 0} dc := []int{0, 0, -1, 1} for len(q_solo) > 0 { current := q_solo[0] q_solo = q_solo[1:] r, c := current.r, current.c for i := 0; i < 4; i++ { nr := r + dr[i] nc := c + dc[i] if nr >= 0 && nr < n && nc >= 0 && nc < m && grid[nr][nc] != '#' && dist_solo[nr][nc] == -1 { dist_solo[nr][nc] = dist_solo[r][c] + 1 q_solo = append(q_solo, Node{nr, nc}) } } } // Step 2: BFS for paired phase dist_pair := make([][]int, n) for i := range dist_pair { dist_pair[i] = make([]int, m) for j := range dist_pair[i] { dist_pair[i][j] = -1 } } q_pair := make([]Node, 0) dist_pair[r_start][c_start] = 0 q_pair = append(q_pair, Node{r_start, c_start}) for len(q_pair) > 0 { current := q_pair[0] q_pair = q_pair[1:] r1, c1 := current.r, current.c r2 := 2*r_start - r1 c2 := 2*c_start - c1 for i := 0; i < 4; i++ { nr1 := r1 + dr[i] nc1 := c1 + dc[i] nr2 := r2 - dr[i] nc2 := c2 - dc[i] if nr1 >= 0 && nr1 < n && nc1 >= 0 && nc1 < m && grid[nr1][nc1] != '#' && nr2 >= 0 && nr2 < n && nc2 >= 0 && nc2 < m && grid[nr2][nc2] != '#' && dist_pair[nr1][nc1] == -1 { dist_pair[nr1][nc1] = dist_pair[r1][c1] + 1 q_pair = append(q_pair, Node{nr1, nc1}) } } } // Step 3: Combine results min_total_time := int64(-1) for r1 := 0; r1 < n; r1++ { for c1 := 0; c1 < m; c1++ { if dist_pair[r1][c1] != -1 { t_pair := int64(dist_pair[r1][c1]) r2 := 2*r_start - r1 c2 := 2*c_start - c1 if r2 >= 0 && r2 < n && c2 >= 0 && c2 < m { if grid[r1][c1] == '@' && dist_solo[r2][c2] != -1 { current_time := t_pair + int64(dist_solo[r2][c2]) if min_total_time == -1 || current_time < min_total_time { min_total_time = current_time } } if grid[r2][c2] == '@' && dist_solo[r1][c1] != -1 { current_time := t_pair + int64(dist_solo[r1][c1]) if min_total_time == -1 || current_time < min_total_time { min_total_time = current_time } } } } } } fmt.Println(min_total_time) }