你被请来给一个要举办高尔夫比赛的树林砍树. 树林由一个非负的二维数组表示, 在这个数组中:

0 表示障碍,无法触碰到.
1 表示可以行走的地面.
比1大的数 表示一颗允许走过的树的高度.
你被要求按照树的高度从低向高砍掉所有的树,每砍过一颗树,树的高度变为1。

你将从(0,0)点开始工作,你应该返回你砍完所有树需要走的最小步数。 如果你无法砍完所有的树,返回 -1 。

可以保证的是,没有两棵树的高度是相同的,并且至少有一颗树需要你砍。

示例 1:

输入:
[
[1,2,3],
[0,0,4],
[7,6,5]
]
输出: 6

示例 2:

输入:
[
[1,2,3],
[0,0,0],
[7,6,5]
]
输出: -1

示例 3:

输入:
[
[2,3,4],
[0,0,5],
[8,7,6]
]
输出: 6

解释: (0,0) 位置的树,你可以直接砍去,不用算步数

提示: 矩阵大小不会超过 50x50 。

解答

采用广度优先搜索,首先把树取出来,然后再排序,然后从起点开始搜索,记录已经修剪到的树
状态:当前修剪的树的编号。下一次修剪的树的编号是在此基础上加1
若当前此状态曾经访问过,则跳过此状态。需要用一个数组存放状态,数组的大小与forest大小相同。

# -*- coding: utf-8 -*-
from collections import deque, namedtupleTreeNode = namedtuple('TreeNode', ['row','col','id'])
class Solution:def cutOffTree(self, forest):""":type forest: List[List[int]]:rtype: int"""# 采用广度优先搜索,首先把树取出来,然后再排序,然后从起点开始搜索,记录已经修剪到的树# 状态:当前修剪的树的编号。下一次修剪的树的编号是在此基础上加1# 若当前此状态曾经访问过,则跳过此状态。需要用一个数组存放状态,数组的大小与forest大小相同# 读取树,并排序M = len(forest)N = len(forest[0])tree_lst = []for i in range(M):for j in range(N):c = forest[i][j]if c > 1:tree_lst.append(c)tree_lst = sorted(tree_lst)nt = len(tree_lst)# 当前已经走的边长度length_step = 0# 保存状态visited = [[-2 for i in range(N)] for j in range(M)]# 初始化的队列q = deque()if tree_lst[0] == forest[0][0]:q.append(TreeNode(0, 0, 0))visited[0][0] = 0else:q.append(TreeNode(0, 0, -1))# 遍历的方向dirs = [(0, -1),(0, 1),(1, 0), (-1, 0)]while q:nq = len(q)while nq:nq = nq -1node = q.popleft()# 判断是否已经砍了所有树if node.id == nt -1:return length_stepfor d in dirs:row = node.row + d[0]col = node.col + d[1]cur_id = node.id# 是否越界if row < 0 or row >= M or col < 0 or col >= N:continuec = forest[row][col]# 是否是墙if c == 0:continue# 是否是树且是接下来要砍的树if c > 1 and tree_lst.index(c) == node.id + 1:# 记录当前砍到了第几个树cur_id = node.id + 1# 判断当前状态是否曾经到达过,若到达过,则此前到达的时候肯定比此次到达更优,则跳过;否则加入队列if visited[row][col]>= cur_id:continuevisited[row][col] = cur_idq.append(TreeNode(row, col, cur_id))# 下一层length_step = length_step + 1return -1

可以用C++写,目前用python写的速度都太慢。

LeetCode--[广度优先搜索]675. 为高尔夫比赛砍树相关推荐

  1. 【宫水三叶的刷题日记】675. 为高尔夫比赛砍树(困难)

    题目描述 这是 LeetCode 上的 675. 为高尔夫比赛砍树 ,难度为 困难. Tag : 「图论 BFS」.「AStar 算法」.「启发式搜索」.「并查集」 你被请来给一个要举办高尔夫比赛的树 ...

  2. Leetcode 675. 为高尔夫比赛砍树 C++

    Leetcode 675. 为高尔夫比赛砍树 题目 你被请来给一个要举办高尔夫比赛的树林砍树. 树林由一个非负的二维数组表示, 在这个数组中: 0 表示障碍,无法触碰到. 1 表示可以行走的地面. 比 ...

  3. 【LeetCode】675. 为高尔夫比赛砍树

    675. 为高尔夫比赛砍树 题目大意 思路 代码 复杂度 原题链接: 675. 为高尔夫比赛砍树 题目大意 你被请来给一个要举办高尔夫比赛的树林砍树.树林由一个 m x n 的矩阵表示, 在这个矩阵中 ...

  4. leetcode 675. 为高尔夫比赛砍树——(每日一难day29)

    675. 为高尔夫比赛砍树 你被请来给一个要举办高尔夫比赛的树林砍树.树林由一个 m x n 的矩阵表示, 在这个矩阵中: 0 表示障碍,无法触碰 1 表示地面,可以行走 比 1 大的数 表示有树的单 ...

  5. golang力扣leetcode 675.为高尔夫比赛砍树

    675.为高尔夫比赛砍树 675.为高尔夫比赛砍树 题解 代码 675.为高尔夫比赛砍树 675.为高尔夫比赛砍树 题解 题目:给一个二维矩阵,0不能走,1是陆地,2+是树,1和1往上都能走,从0,0 ...

  6. LeetCode 675. 为高尔夫比赛砍树

    675. 为高尔夫比赛砍树 [BFS]其实这个就是把点按照从小到大的顺序排序,然后BFS算出相邻点的距离累加起来,需要注意要从(0,0)开始走,所以一开始就加入一个(0,0,1)这样即使开始的最小值在 ...

  7. Leetcode 675.为高尔夫比赛砍树

    为高尔夫比赛砍树 你被请来给一个要举办高尔夫比赛的树林砍树. 树林由一个非负的二维数组表示, 在这个数组中: 0 表示障碍,无法触碰到. 1 表示可以行走的地面. 比1大的数 表示一颗允许走过的树的高 ...

  8. 675 为高尔夫比赛砍树(宽搜)

    1. 问题描述: 你被请来给一个要举办高尔夫比赛的树林砍树.树林由一个 m x n 的矩阵表示, 在这个矩阵中: 0 表示障碍,无法触碰 1 表示地面,可以行走 比 1 大的数表示有树的单元格,可以行 ...

  9. 675. 为高尔夫比赛砍树 bfs

    你被请来给一个要举办高尔夫比赛的树林砍树. 树林由一个非负的二维数组表示, 在这个数组中: 0 表示障碍,无法触碰到. 1 表示可以行走的地面. 比1大的数 表示一颗允许走过的树的高度. 你被要求按照 ...

最新文章

  1. 干货 | 5个常用的深度学习框架
  2. python include函数_python 库函数
  3. adb 重命名_Linux操作系统:三种最基本的文件重命名方法
  4. 3.2 目标点检测-深度学习第四课《卷积神经网络》-Stanford吴恩达教授
  5. python加载项向导_什么是 Python 加载项?
  6. mac m1下golang连接mysql极速入门
  7. 字符串中最后一个词组的长度 Length of Last Word
  8. Qt调用动态链接库ControlCAN.dll实例
  9. Kafka集群安装--测试--关闭
  10. Python模拟实现multipart/form-data格式上传图片文件
  11. 信息学奥赛C++语言:求满足条件的二位数
  12. 标题栏透明android,android改变标题栏的透明度
  13. Ubuntu -- 无法正常安装卸载ssh以及chattr无反应的问题
  14. 用excel制作项目管理甘特图
  15. 33 | 解读TPU:设计和拆解一块ASIC芯片
  16. Fedora 30 将默认启用 DNF-best 模式
  17. win10浏览器加载很慢_Win10 IE浏览器的网页加载速度很慢总是卡死怎么办
  18. Vue实现动态复选框的全选 全不选 获取选中值
  19. 《power BI》 高级筛选器Filter 和Values人工造表 ALL 函数
  20. 腾讯“鹅城”开建,斥资370亿;提前泄露小米新机博主被判赔偿100万;传字节跳动实习生删除GB以下所有机器学习模型 | EA周报...

热门文章

  1. Linux 嵌入式开发 网络编程: day4
  2. 铁塔公司来了:运营商为何需要共建共享?
  3. LeetCode-SQL题目集
  4. 全排列函数和自写排列
  5. Layer 关闭当前页面并且刷新父页面
  6. 远程桌面端口默认是什么?修改远程桌面端口号方法
  7. 新华书店也网售 要与当当、卓越“三足鼎立”?
  8. if 和 eif语句
  9. 史上最强像素画教程「Pixel Art」像素画入门教学本
  10. 我花8个月从0开始面上大厂自动化测试岗,拿个18k不过分吧?