package main import . "fmt" import . "os" import bf "bufio" func main() { rd := bf.NewReader(Stdin) var h,w int Fscan(rd,&h,&w) field := make([]string, h) for i := range field { Fscan(rd,&field[i]) } ans := solve(h, w, field) Println(ans) } func solve(h, w int, field []string) int { ans := h+w dist1 := make([][]int, h) dist2 := make([][]int, h) for i := range field { dist1[i] = make([]int, w) dist2[i] = make([]int, w) } mv := []*P{ &P{1,0},&P{0,1},&P{-1,0},&P{0,-1} } ps := []*P{ &P{ 0, 0 } } dist1[0][0] = -1 for i := 1; len(ps) > 0; i++ { tmp := []*P{} for _, p := range ps { for _, m := range mv { row,col := p.row+m.row,p.col+m.col if row<0||row>=h||col<0||col>=w { continue } if field[row][col] == '#' { continue } if dist1[row][col] == 0 { dist1[row][col] = i tmp = append(tmp, &P{row, col}) } } } ps = tmp } for row := 0; row < h; row++ { for col := 0; col < w; col++ { if p := &dist1[row][col]; *p == 0 { *p = 1e9 } } } dist1[0][0] = 0 if d := dist1[h-1][w-1]; d > 0 { ans = min(ans, d) } ps = []*P{ &P{h-1,w-1} } dist2[h-1][w-1] = -1 for i := 1; len(ps) > 0; i++ { tmp := []*P{} for _, p := range ps { for _, m := range mv { row,col := p.row+m.row,p.col+m.col if row<0||row>=h||col<0||col>=w { continue } if field[row][col] == '#' { continue } if dist2[row][col] == 0 { dist2[row][col] = i tmp = append(tmp, &P{row, col}) } } } ps = tmp } for row := 0; row < h; row++ { for col := 0; col < w; col++ { if p := &dist2[row][col]; *p == 0 { *p = 1e9 } } } dist2[h-1][w-1] = 0 col1 := make([]int, w) col2 := make([]int, w) for i := range col1 { col1[i] = 1e9 col2[i] = 1e9 } row1 := make([]int, h) row2 := make([]int, h) for i := range row1 { row1[i] = 1e9 row2[i] = 1e9 } for row := 0; row < h; row++ { for col := 0; col < w; col++ { col1[col] = min(col1[col], dist1[row][col]-row) col2[col] = min(col2[col], dist2[row][col]+row) row1[row] = min(row1[row], dist1[row][col]-col) row2[row] = min(row2[row], dist2[row][col]+col) } } for col := 0; col+1 < w; col++ { ans = min(ans, col1[col]+col2[col+1]+2) } for row := 0; row+1 < h; row++ { ans = min(ans, row1[row]+row2[row+1]+2) } return ans } type P struct { row, col int }