結果
| 問題 | No.3504 Insert Maze |
| コンテスト | |
| ユーザー |
ID 21712
|
| 提出日時 | 2026-04-18 22:02:30 |
| 言語 | Go (1.26.1) |
| 結果 |
AC
|
| 実行時間 | 634 ms / 2,000 ms |
| コード長 | 2,390 bytes |
| 記録 | |
| コンパイル時間 | 14,149 ms |
| コンパイル使用メモリ | 274,772 KB |
| 実行使用メモリ | 140,620 KB |
| 最終ジャッジ日時 | 2026-04-18 22:03:06 |
| 合計ジャッジ時間 | 30,891 ms |
|
ジャッジサーバーID (参考情報) |
judge3_1 / judge2_0 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 85 |
ソースコード
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
}
ID 21712