根据得到的steps倒推最终路径展示

来源:12-2 迷宫代码实现

此恨绵绵无绝期

2022-02-20


func main(){
	// ... 省略视频中代码
	
	fmt.Println("-----路径展示-----")
	paths := getPaths(steps,
		point{len(maze) - 1, len(maze[0]) - 1})
	for _, row := range paths {
		for _, val := range row {
			fmt.Printf("%3d", val)
		}
		fmt.Println()
	}
}

func getPaths(steps [][]int, end point) [][]int {
	paths := make([][]int, len(steps))
	for i := range paths {
		paths[i] = make([]int, len(steps[i]))
	}
	//定义最后结束的位置和步数
	stepsNumber := steps[len(steps)-1][len(steps[0])-1]
	paths[len(steps)-1][len(steps[0])-1] = stepsNumber
	cur := end
	for stepsNumber > 0 {
		for _, dir := range dirs {
			last := cur.reduce(dir)
			val, ok := last.at(steps)
			if ok != true || val != stepsNumber-1 {
				continue
			}
			//如果上一步符合 步数-1的情况,则赋值后跳过当前上左下右探查步骤,进入下一轮探查
			stepsNumber--
			paths[last.i][last.j] = stepsNumber
			cur = last
			break
		}
	}
	return paths
}

func (p point) reduce(r point) point {
	return point{p.i - r.i, p.j - r.j}
}

图片描述

写回答

1回答

ccmouse

2022-05-10

就是这么做的,有个很小改动可以让代码清晰些:

stepsNumber := steps[len(steps)-1][len(steps[0])-1]

paths[len(steps)-1][len(steps[0])-1] = stepsNumber

这两句可以通过传入的end点来实现,这样以后end不在右下角也能工作

0
0

Google资深工程师深度讲解Go语言 由浅入深掌握Go语言

语法+分布式爬虫实战 为转型工程师量身打造

5995 学习 · 1909 问题

查看课程