IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 576. 出界的路径数 -> 正文阅读

[数据结构与算法]576. 出界的路径数

原题链接

题目描述

给你一个大小为 m x n 的网格和一个球。球的起始坐标为 [startRow, startColumn] 。你可以将球移到在四个方向上相邻的单元格内(可以穿过网格边界到达网格之外)。你 最多 可以移动 maxMove 次球。
给你五个整数 m、n、maxMove、startRow 以及 startColumn ,找出并返回可以将球移出边界的路径数量。因为答案可能非常大,返回对 109 + 7 取余 后的结果。
示例 1:
在这里插入图片描述
输入:m = 2, n = 2, maxMove = 2, startRow = 0, startColumn = 0
输出:6
提示
1 <= m, n <= 50
0 <= maxMove <= 50
0 <= startRow < m
0 <= startColumn < n

解题:

方法1 动态规划
class Solution(object):
    def findPaths(self, m, n, maxMove, startRow, startColumn):
    	# 四个方向
        dirs = [[0, 1], [0, -1], [1, 0], [-1, 0]]
        # dp[i][j][k]表示移动i步能够到达(i,j)的路径数
        dp = [[[0 for _ in range(n)] for _ in range(m)] for _ in range(maxMove + 1)]
        # 动态规划边界情况
        dp[0][startRow][startColumn] = 1
        ans = 0
        MOD = 1e9 + 7
        for i in range(maxMove):
            for j in range(m):
                for k in range(n):
                    for dir in dirs:
                        newR, newC = j + dir[0], k + dir[1]
                        if newR >= m or newR <= -1 or newC >= n or newC <= -1:
                            ans += dp[i][j][k]
                            ans %= MOD
                        else:
                            dp[i + 1][newR][newC] += dp[i][j][k]
                            dp[i + 1][newR][newC] %= MOD
        return int(ans)
方法2 dfs+记忆化搜索

(这种方法用时最少)

class Solution(object):
    def findPaths(self, m, n, maxMove, startRow, startColumn):
        MOD = 1e9 + 7
        dp = [[[-1 for _ in range(n)] for _ in range(m)] for _ in range(maxMove + 1)]
        def dfs(x, y, k):
        	# 到达边界的情况
            if x < 0 or x >= m or y < 0 or y >= n:
                return 1
            # 没有到达边界但是剩余步数已经不够的情况
            if k == 0:
                return 0
            # 如果之前计算过dp[k][x][y]的值,就直接返回,从而实现记忆化搜索
            if dp[k][x][y] != -1:
                return dp[k][x][y]
            dp[k][x][y] = (dfs(x - 1, y, k - 1) + dfs(x, y - 1, k - 1) + dfs(x + 1, y, k - 1) + dfs(x, y + 1, k - 1)) % MOD
            return dp[k][x][y]
        return int(dfs(startRow, startColumn, maxMove))
队列实现BFS
class Solution(object):
    def findPaths(self, m, n, maxMove, startRow, startColumn):
        q = [(startRow, startColumn)]
        dirs = [(0, 1), (0, -1), (1, 0), (-1, 0)]
        dp = [[0 for _ in range(n)] for _ in range(m)]
        dp[startRow][startColumn] = 1
        ans = 0
        MOD = 1e9 + 7
        for _ in range(maxMove): #遍历每种步数
            length = len(q)
            for _ in range(length): #遍历相同步数能够到达的点的情况
                (tmpR, tmpC) = q.pop(0)
                for dir in dirs:
                    newR, newC = tmpR + dir[0], tmpC + dir[1]
                    if newC == -1 or newC == n or newR == -1 or newR == m:
                        ans = (ans + dp[tmpR][tmpC]) % MOD
                    else:
                        if dp[newR][newC] == 0: 
                            q.append((newR, newC))
                        dp[newR][newC] = (dp[newR][newC] + dp[tmpR][tmpC]) % MOD
                dp[tmpR][tmpC] = 0
        return int(ans)
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-08-17 01:30:19  更:2021-08-17 01:30:48 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 21:51:30-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码