package main import ( "fmt" ) type Node struct{ x,y int path [][]int // 从起点到该点的路径 } func main() { var h,w int fmt.Scanf("%d %d", &h, &w) var k = make([][]int, h) var v = make([][]bool,h) for i:=0;i<h;i++{ k[i] = make([]int, w) v[i] = make([]bool, w) for j:=0;j<w;j++{ fmt.Scanf("%d", &k[i][j]) } } queue := []Node{{0,0,[][]int{{0,0}}}} v[0][0] = true var dist [][]int = [][]int{{1,0}, {-1,0}, {0,-1}, {0,1}} for len(queue) > 0 { cur := queue[0] queue = queue[1:] if cur.x == h-1 && cur.y == w-1 { for _, d := range cur.path { fmt.Printf("(%d,%d)\n", d[0],d[1]) } return } for _, d := range dist { ni, nj := cur.x + d[0], cur.y + d[1] if ni<0 || ni>=h || nj<0 || nj>=w || v[ni][nj] || k[ni][nj] == 1 { continue } v[ni][nj] = true // 创建新路径:复制 cur.path newPath := make([][]int, len(cur.path)) copy(newPath, cur.path) newPath = append(newPath, []int{ni,nj}) /* 注意:append(cur.path,[]int{ni,nj})是使用同一个底层数组,不是深复制 所有path实际共用同一个底层数组,这是不正确的 */ queue = append(queue, Node{ni,nj, newPath}) } } }