技巧
BFS
思路
模板题 加入曼哈顿距离的优化
实现
package main
import (
"bufio"
. "fmt"
"io"
"math"
"os"
"sort"
"strings"
)
type Pos struct {
x, y, step int
}
var (
dx = []int{0, 1, -1, 0}
dy = []int{1, 0, 0, -1}
)
func NC14572(_r io.Reader, _w io.Writer) {
in, out := bufio.NewReader(_r), bufio.NewWriter(_w)
defer out.Flush()
for {
var n, m int
Fscan(in, &n, &m)
if n == 0 && m == 0 {
break
}
vis := [510][510]bool{}
maze := make([]string, n)
var sx, sy, ex, ey int
for i := 0; i < n; i++ {
Fscan(in, &maze[i])
if j := strings.IndexRune(maze[i], 'S'); j != -1 {
sx, sy = i, j
vis[sx][sy] = true
}
if j := strings.IndexRune(maze[i], 'E'); j != -1 {
ex, ey = i, j
}
}
ans := -1
q := make([]Pos, 0)
q = append(q, Pos{sx, sy, 0})
for len(q) > 0 {
top := q[0]
q = q[1:]
vis[top.x][top.y] = true
if maze[top.x][top.y] == 'E' {
ans = top.step
break
}
pa := make([]Pos, 0)
for i := 0; i < 4; i++ {
nx, ny := top.x+dx[i], top.y+dy[i]
if nx >= 0 && ny >= 0 && nx < n && ny < m && !vis[nx][ny] && maze[nx][ny] != '#' {
pa = append(pa, Pos{nx, ny, 1 + top.step})
}
}
sort.Slice(pa, func(i, j int) bool {
return math.Abs(float64(ex-pa[i].x))+math.Abs(float64(ey-pa[i].y)) < math.Abs(float64(ex-pa[j].x))+math.Abs(float64(ey-pa[j].y))
})
for i := 0; i < len(pa); i++ {
q = append(q, pa[i])
}
}
if ans == -1 {
Fprintln(out, "No")
} else {
Fprintln(out, "Yes")
}
}
}
func main() {
NC14572(os.Stdin, os.Stdout)
}

京公网安备 11010502036488号