返回目录
题目描述
园区某部门举办了Family Day,邀请员工及其家属参加;
将公司园区视为一个矩形,起始园区设置在左上角,终点园区设置在右下角;
家属参观园区时,只能向右和向下园区前进,求从起始园区到终点园区会有多少条不同的参观路径。

输入描述
第一行为园区的长和宽;
后面每一行表示该园区是否可以参观,0表示可以参观,1表示不能参观
输出描述
输出为不同的路径数量
示例:
| 输入 | 3 3 0 0 0 0 1 0 0 0 0 | 
|---|---|
| 输出 | 2 | 
| 说明 | 无 | 
题目解析
本题如果地图矩阵数量级过大的话,深搜解题会超时。因此,更优解法是利用动态规划,我们可以定义一个dp二维数组,dpi的含义是:从坐标(0,0)到达坐标(i, j)的路径数
而本题说只能向下或者向右运动,因此到达一个坐标点,可能来自其上方,亦可能来自其左方
因此 dpi = dpi-1 + dpi
即:
如果到达(i-1,j)的路径有dpi-1条,那么到达(i,j)的路径也有dpi-1条
同理到达(i, j-1)的路径有dpi,那么到达(i,j)的路径也有dpi条
因此:dpi = dpi-1 + dpi
Python算法源码
# 读取输入
n, m = map(int, input().split())
# 读取地图矩阵
matrix = []
for i in range(n):
    row = list(map(int, input().split()))
    matrix.append(row)
# 如果起点或终点为障碍物,无解
if matrix[0][0] == 1 or matrix[n - 1][m - 1] == 1:
    print("0")
    exit()
# 初始化dp数组
dp = [[0] * m for _ in range(n)]
dp[0][0] = 1
# 动态规划求解
for i in range(n):
    for j in range(m):
        if matrix[i][j] == 1:
            continue
        if i > 0:
            dp[i][j] += dp[i - 1][j]
        if j > 0:
            dp[i][j] += dp[i][j - 1]
# 输出结果
print(dp[n - 1][m - 1])C算法源码
#include <stdio.h>
int main() {
    // 创建输入扫描器
    int n, m;
    scanf("%d %d", &n, &m);
    // 创建地图矩阵
    int matrix[n][m];
    // 读取地图矩阵
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            scanf("%d", &matrix[i][j]);
        }
    }
    // 如果起点和终点不能参观,则没有路径
    if (matrix[0][0] == 1 || matrix[n - 1][m - 1] == 1) {
        printf("0\n");
        return 0;
    }
    // 初始化dp数组
    long dp[n][m];
    dp[0][0] = 1;
    // 动态规划求解
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            if (matrix[i][j] == 1) {
                continue;
            }
            if (i > 0) {
                dp[i][j] += dp[i - 1][j];
            }
            if (j > 0) {
                dp[i][j] += dp[i][j - 1];
            }
        }
    }
    // 输出结果
    printf("%ld\n", dp[n - 1][m - 1]);
    return 0;
}java算法源码
import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        // 创建输入扫描器
        Scanner scanner = new Scanner(System.in);
        // 读取输入,获取地图行数和列数
        int n = scanner.nextInt();
        int m = scanner.nextInt();
        // 创建地图矩阵
        int[][] matrix = new int[n][m];
        // 读取地图矩阵
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                matrix[i][j] = scanner.nextInt();
            }
        }
        // 如果起点或终点为障碍物,无解
        if (matrix[0][0] == 1 || matrix[n - 1][m - 1] == 1) {
            System.out.println("0");
            return;
        }
        // 初始化dp数组
        long[][] dp = new long[n][m];
        dp[0][0] = 1;
        // 动态规划求解
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                if (matrix[i][j] == 1) {
                    continue;
                }
                if (i > 0) {
                    dp[i][j] += dp[i - 1][j];
                }
                if (j > 0) {
                    dp[i][j] += dp[i][j - 1];
                }
            }
        }
        // 输出结果
        System.out.println(dp[n - 1][m - 1]);
    }
}
3 条评论
[...]2024 C卷 100分序号题目知 识 点难易程度1密码输入检测数据结构/栈☆☆☆2分配土地几何问题☆☆☆3找座位逻辑分析☆☆☆4智能成绩表动态条件分析☆☆☆5内存冷热标记多条件排序☆☆☆6螺旋数字矩阵逻辑分析☆☆☆7围棋的气逻辑分析☆☆☆8分割平衡字符串逻辑分析☆☆☆9机器人搬砖二分法☆☆☆10转盘寿司数据结构/栈/单调栈☆☆☆11小明找位置二分法☆☆☆12提取字符串的最长合法简单数学表达式双指[...]
[...]2024 C卷 100分序号题目知 识 点难易程度1密码输入检测数据结构/栈☆☆☆2分配土地几何问题☆☆☆3找座位逻辑分析☆☆☆4智能成绩表动态条件分析☆☆☆5内存冷热标记多条件排序☆☆☆6螺旋数字矩阵逻辑分析☆☆☆7围棋的气逻辑分析☆☆☆8分割平衡字符串逻辑分析☆☆☆9机器人搬砖二分法☆☆☆10转盘寿司数据结构/栈/单调栈☆☆☆11小明找位置二分法☆☆☆12提取字符串的最长合法简单数学表达式双指[...]
[...]2024 C卷 100分序号题目知 识 点难易程度1密码输入检测数据结构/栈☆☆☆2分配土地几何问题☆☆☆3找座位逻辑分析☆☆☆4智能成绩表动态条件分析☆☆☆5内存冷热标记多条件排序☆☆☆6螺旋数字矩阵逻辑分析☆☆☆7围棋的气逻辑分析☆☆☆8分割平衡字符串逻辑分析☆☆☆9机器人搬砖二分法☆☆☆10转盘寿司数据结构/栈/单调栈☆☆☆11小明找位置二分法☆☆☆12提取字符串的最长合法简单数学表达式双指[...]