前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >2022-04-10:给定一个二维数组,其中全是非负数, 每一步都可以往上、下、左、右四个方向运动。 返回从左上角走到右下角的最短距离。

2022-04-10:给定一个二维数组,其中全是非负数, 每一步都可以往上、下、左、右四个方向运动。 返回从左上角走到右下角的最短距离。

原创
作者头像
福大大架构师每日一题
发布2022-04-10 21:52:28
1190
发布2022-04-10 21:52:28
举报

2022-04-10:给定一个二维数组,其中全是非负数,

每一步都可以往上、下、左、右四个方向运动。

返回从左上角走到右下角的最短距离。

答案2022-04-10:

单元最短路径算法。堆。

代码用golang编写。代码如下:

代码语言:go
复制
package main

import (
	"fmt"
	"sort"
)

func main() {
	arr := [][]int{
		{1, 2, 3, 4},
		{5, 6, 7, 8},
		{9, 10, 11, 12},
		{13, 14, 15, 16}}
	ret := bestWalk2(arr)
	fmt.Println(ret)
}

func bestWalk2(map0 [][]int) int {

	n := len(map0)
	m := len(map0[0])
	// 堆
	// 每一个对象,都是一个小数组
	// {dis, row, col}
	//  0    1    2
	heap0 := make([][]int, 0)
	// X,0,1 已经弹出了! 以后在遇到(0,1)的事情,不管!
	// poped记录哪些位置弹出,哪些没有!
	poped := make([][]bool, n)
	for i := 0; i < n; i++ {
		poped[i] = make([]bool, m)
	}
	heap0 = append(heap0, []int{map0[0][0], 0, 0})
	ans := 0
	for len(heap0) > 0 {
		sort.Slice(heap0, func(i, j int) bool {
			a := heap0[i]
			b := heap0[j]
			return a[0] < b[0]
		})
		cur := heap0[0]
		heap0 = heap0[1:]
		dis := cur[0]
		row := cur[1]
		col := cur[2]
		if poped[row][col] {
			continue
		}
		// 接下来就是要处理这个位置了!
		poped[row][col] = true
		if row == n-1 && col == m-1 {
			ans = dis
			break
		}
		add(dis, row-1, col, n, m, map0, poped, &heap0)
		add(dis, row+1, col, n, m, map0, poped, &heap0)
		add(dis, row, col-1, n, m, map0, poped, &heap0)
		add(dis, row, col+1, n, m, map0, poped, &heap0)
	}
	return ans
}

func add(pre, row, col, n, m int, map0 [][]int, used [][]bool, heap0 *[][]int) {
	if row >= 0 && row < n && col >= 0 && col < m && !used[row][col] {
		*heap0 = append(*heap0, []int{pre + map0[row][col], row, col})
	}
}

执行结果如下:

在这里插入图片描述
在这里插入图片描述

左神java代码

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档