技巧
bfs
思路
bfs模板题 要注意的是要用int8 不然爆内存 有点恶心。。。
实现
package main
import (
"bufio"
. "fmt"
"io"
"os"
"strconv"
)
type Ele struct {
a [3][3]int8
opt string
xpos [2]int8
}
var (
do = [4]string{"u", "r", "d", "l"}
dx = [4]int8{-1, 0, 1, 0}
dy = [4]int8{0, 1, 0, -1}
T = [3][3]int8{
{1, 2, 3},
{4, 5, 6},
{7, 8, -1},
}
vis = make(map[[3][3]int8]bool)
)
func bfs(a [3][3]int8, xpos [2]int8) string {
q := make([]Ele, 1)
q[0] = Ele{a, "", xpos}
for len(q) > 0 {
top := q[0]
q = q[1:]
if top.a == T {
return top.opt
}
vis[top.a] = true
for i := 0; i < 4; i++ {
nx := dx[i] + top.xpos[0]
ny := dy[i] + top.xpos[1]
if nx >= 0 && ny >= 0 && nx < 3 && ny < 3 {
na := top.a
na[top.xpos[0]][top.xpos[1]], na[nx][ny] = na[nx][ny], na[top.xpos[0]][top.xpos[1]]
if _, ok := vis[na]; !ok {
q = append(q, Ele{na, top.opt + do[i], [2]int8{nx, ny}})
}
}
}
}
return ""
}
func NC51032(_r io.Reader, _w io.Writer) {
in, out := bufio.NewReader(_r), bufio.NewWriter(_w)
defer out.Flush()
a := [3][3]int8{}
xpos := [2]int8{}
for i := 0; i < 9; i++ {
var e string
Fscan(in, &e)
if e == "x" {
e = "-1"
xpos[0] = int8(i / 3)
xpos[1] = int8(i % 3)
}
num, _ := strconv.Atoi(e)
a[i/3][i%3] = int8(num)
}
Fprintln(out, bfs(a, xpos))
}
func main() {
NC51032(os.Stdin, os.Stdout)
}

京公网安备 11010502036488号