【NOIP普及组】 过河卒

news2024/11/7 21:12:13

【NOIP普及组】 过河卒


💐The Begin💐点点关注,收藏不迷路💐

如图,A 点有一个过河卒,需要走到目标 B 点。卒行走规则:可以向下、或者向右。同时在棋盘上的任一点有一个对方的马(如上图的C点),该马所在的点和所有跳跃一步可达的点称为对方马的控制点。例如上图 C 点上的马可以控制 9 个点(图中的P1,P2 … P8 和 C)。卒不能通过对方马的控制点。

在这里插入图片描述

棋盘用坐标表示,A 点(0,0)、B 点(n,m)(n,m 为不超过 20 的整数,并由键盘输入),同样马的位置坐标是需要给出的(约定: C<>A,同时C<>B)。现在要求你计算出卒从 A 点能够到达 B 点的路径的条数。

输入

一行四个数据,分别表示B点坐标和马的坐标。

输出

一个数据,表示所有的路径条数。

样例输入

6 6 3 2

样例输出

17

C 语言实现的代码:

#include <stdio.h>

// 定义最大棋盘尺寸
#define MAX_SIZE 30

// 马的移动坐标变化量
int horseXSteps[] = {-2, -2, -1, -1, 1, 1, 2, 2};
int horseYSteps[] = {1, -1, 2, -2, 2, -2, 1, -1};

int main() {
    int n, m, x, y;
    // 输入终点位置和马的位置
    scanf("%d %d %d %d", &n, &m, &x, &y);
    n += 1; // 整体空出一行一列,便于边界检查
    m += 1;
    x += 1;
    y += 1;
    long long dp[MAX_SIZE][MAX_SIZE] = {0};
    dp[1][0] = 1;
    // 标记马能一步跳到的位置为不可达(值为 -1)
    for (int i = 0; i < 8; i++) {
        int newX = x + horseXSteps[i];
        int newY = y + horseYSteps[i];
        if (newX >= 1 && newX <= n && newY >= 1 && newY <= m) {
            dp[newX][newY] = -1;
        }
    }
    // 马所在的位置也不能走,标记为 -1
    dp[x][y] = -1;
    // 遍历所有的行和列,计算路径条数
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= m; j++) {
            if (dp[i][j] == -1) {
                dp[i][j] = 0;
            } else {
                dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
            }
        }
    }
    // 输出从起点到终点的路径条数
    printf("%lld\n", dp[n][m]);
    return 0;
}

在这里插入图片描述

C++实现的代码:

#include <iostream>

// 定义最大棋盘尺寸
const int MAX_SIZE = 30;

// 马的移动坐标变化量
int horseXSteps[] = {-2, -2, -1, -1, 1, 1, 2, 2};
int horseYSteps[] = {1, -1, 2, -2, 2, -2, 1, -1};

int main() {
    int n, m, x, y;
    // 输入终点位置和马的位置
    std::cin >> n >> m >> x >> y;
    n += 1; // 整体空出一行一列,便于边界检查
    m += 1;
    x += 1;
    y += 1;
    long long dp[MAX_SIZE][MAX_SIZE] = {0};
    dp[1][0] = 1;
    // 标记马能一步跳到的位置为不可达(值为 -1)
    for (int i = 0; i < 8; i++) {
        int newX = x + horseXSteps[i];
        int newY = y + horseYSteps[i];
        if (newX >= 1 && newX <= n && newY >= 1 && newY <= m) {
            dp[newX][newY] = -1;
        }
    }
    // 马所在的位置也不能走,标记为 -1
    dp[x][y] = -1;
    // 遍历所有的行和列,计算路径条数
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= m; j++) {
            if (dp[i][j] == -1) {
                dp[i][j] = 0;
            } else {
                dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
            }
        }
    }
    // 输出从起点到终点的路径条数
    std::cout << dp[n][m] << std::endl;
    return 0;
}

Java 实现的代码:

import java.util.Scanner;

class PathCounting {
    // 定义最大棋盘尺寸
    static final int MAX_SIZE = 30;

    // 马的移动坐标变化量
    static int[] horseXSteps = {-2, -2, -1, -1, 1, 1, 2, 2};
    static int[] horseYSteps = {1, -1, 2, -2, 2, -2, 1, -1};

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n, m, x, y;
        // 输入终点位置和马的位置
        n = scanner.nextInt();
        m = scanner.nextInt();
        x = scanner.nextInt();
        y = scanner.nextInt();
        n += 1; // 整体空出一行一列,便于边界检查
        m += 1;
        x += 1;
        y += 1;
        long[][] dp = new long[MAX_SIZE][MAX_SIZE];
        dp[1][0] = 1;
        // 标记马能一步跳到的位置为不可达(值为 -1)
        for (int i = 0; i < 8; i++) {
            int newX = x + horseXSteps[i];
            int newY = y + horseYSteps[i];
            if (newX >= 1 && newX <= n && newY >= 1 && newY <= m) {
                dp[newX][newY] = -1;
            }
        }
        // 马所在的位置也不能走,标记为 -1
        dp[x][y] = -1;
        // 遍历所有的行和列,计算路径条数
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= m; j++) {
                if (dp[i][j] == -1) {
                    dp[i][j] = 0;
                } else {
                    dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
                }
            }
        }
        // 输出从起点到终点的路径条数
        System.out.println(dp[n][m]);
    }
}

Python 实现的代码:

# 定义最大棋盘尺寸
MAX_SIZE = 30

# 马的移动坐标变化量
horseXSteps = [-2, -2, -1, -1, 1, 1, 2, 2]
horseYSteps = [1, -1, 2, -2, 2, -2, 1, -1]

n, m, x, y = map(int, input().split())
n += 1
m += 1
x += 1
y += 1
dp = [[0] * MAX_SIZE for _ in range(MAX_SIZE)]
dp[1][0] = 1
# 标记马能一步跳到的位置为不可达(值为 -1)
for i in range(8):
    newX = x + horseXSteps[i]
    newY = y + horseYSteps[i]
    if newX >= 1 and newX <= n and newY >= 1 and newY <= m:
        dp[newX][newY] = -1
# 马所在的位置也不能走,标记为 -1
dp[x][y] = -1
# 遍历所有的行和列,计算路径条数
for i in range(1, n + 1):
    for j in range(1, m + 1):
        if dp[i][j] == -1:
            dp[i][j] = 0
        else:
            dp[i][j] = dp[i - 1][j] + dp[i][j - 1]
# 输出从起点到终点的路径条数
print(dp[n][m])

在这里插入图片描述


💐The End💐点点关注,收藏不迷路💐

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2229548.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

功能强大视频编辑软件 Movavi Video Editor Plus 2024 v24.2.0 中文特别版

Movavi Video Editor Plus中文修改版是一款功能强大的视频制作编辑软件&#xff0c;使用能够帮助用户快速从录制的素材中制作成一个精美的电影&#xff0c;支持进行视频剪辑&#xff0c;支持添加背影、音乐和各种音乐&#xff0c;软件使用简单&#xff0c;无需任何的经验和专业…

linux基本指令之文件操作

前言 这次博客的主要目的就是要解决如何快速查看或查找文件&#xff0c;以及讲解文件的一些属性。本次博客还是以基本指令为主来理解linux对文件的操作。 linux下输入输出流的理解 在linux中&#xff0c;我们要对文件进行输入输出时&#xff0c;一般会怎么做呢? 可以通过pr…

JavaEE初阶---网络原理值TCP篇(三)

文章目录 1.延时应答机制2.捎带应答3.面向字节流---粘包问题3.1问题引入3.2解决方法 4.异常情况的处理5.TCP的心跳机制6.TCP/UDP的对比 1.延时应答机制 例如我们的这个剩余空间大小10kb,如果我们直接返回ack,这个发送方的窗口大小只能是10kb&#xff0c;但是如果我们进行延时&…

慢sql优化和Explain解析

要想程序跑的快&#xff0c;sql优化不可懈怠&#xff01;今日来总结一下常用的慢sql的分析和优化的方法。 1、慢sql的执行分析&#xff1a; 大家都知道分析一个sql语句执行效率的方法是用explain关键词&#xff1a; 举例&#xff1a;sql:select * from test where bussiness_…

Java后端面试内容总结

先讲项目背景&#xff0c;再讲技术栈模块划分&#xff0c; 讲业务的时候可以先讲一般再特殊 为什么用这个&#xff0c;好处是什么&#xff0c;应用场景 Debug发现问题/日志发现问题. QPS TPS 项目单元测试&#xff0c;代码的变更覆盖率达到80%&#xff0c;项目的复用性高…

【10月】新款3DMAX插件排行榜

根据近期的行业动态和插件发布情况&#xff0c;整理并推荐一些在10月或近期内受到关注的3DMAX新款插件。 1. MaxToCAD插件 功能特点&#xff1a;允许用户将3D MAX中的三维模型快速转换为CAD软件可识别的二维平面图&#xff0c;适用于需要将3D设计导出为施工图或平面图的设计师…

【数据结构与算法】第7课—数据结构之队列

文章目录 1. 队列1.1 什么是队列1.2 队列的结构1.3 队列初始化1.4 队列入栈1.5 出队列1.6 查找队列有效元素个数1.7 取队头和队尾数据1.8 销毁链表 2. 用两个队列实现栈3. 用两个栈实现队列4. 循环队列 1. 队列 注&#xff1a;文中Queue是队列&#xff0c;Quene是错误写法 1.1 …

window快捷键:window + v 打开剪切板历史记录 / 非常实用

一、剪切板历史记录功能介绍 1.1、window v 打开剪切板历史记录 / 文字、图片都可记录 1.2、window v 最近使用 1.3、window v 表情符号 1.4、window v GIF 1.5、window v 颜文字 1.6、window v 符号 二、欢迎交流指正

手机功耗异常大数据看板建设

一、背景 基于《软件绿色联盟应用体验标准—功耗标准》监控软硬件资源功耗异常类别与趋势 上述为手机功耗问题的前世今生及我们应该在哪些维度建立功耗的埋点监控支持分析​ 二、目标 手机端侧建立alarm\wakelock\wakeup\gps\bt\cpu\sensor\netTriffic等功耗相关的使用次数和时…

多彩电子显示屏

在仓储管理的广阔舞台上&#xff0c;一款名为“仓库46代”的创新标签悄然登场&#xff0c;它不仅是技术的飞跃&#xff0c;更是智慧仓储的新篇章。这款标签&#xff0c;以其独特的515.6x260x29mm身材&#xff0c;优雅地融入了繁忙的仓库环境&#xff0c;其沉稳的黑色外观&#…

sklearn|机器学习:决策树(一)

文章目录 sklearn&#xff5c;机器学习&#xff1a;决策树&#xff08;一&#xff09;&#xff08;一&#xff09;概述&#xff08;二&#xff09;实战1. 环境配置2. sklearn 中的决策树&#xff08;1&#xff09;模块 sklearn.tree&#xff08;2&#xff09;sklearn 基本建模流…

服务器Linux系统网络重启失败 Restarting network (via systemctl):......

网络重启时报错&#xff1a; Linux 网络服务重启失败可能由网络配置工具冲突或配置错误引起。 冲突问题&#xff1a;在 Linux 中&#xff0c;network 和 NetworkManager 这两个工具可能会冲突&#xff0c;禁用 NetworkManager 可以尝试解决该问题。 先停止服务 systemctl s…

域控操作二十四:主域故障辅域接替

模拟环境&#xff1a;上海DC1故障无法开机&#xff0c;导致只有一个DNS的电脑无法上网&#xff08;实际可以添加DC2但是为了实验就不说了&#xff09; FSMO还在DC1上 使用powershell把角色迁移到DC2 ntdsutil roles connections connect to server DC2SHA.whbk.cn quitSeize …

边缘AI计算技术应用-实训解决方案

一、解决方案架构 1.1 来自产业的项目 实训项目全部是基于产业的商业化项目&#xff0c;经过角色拆解、任务拆解、代码拆解、部署流程拆解等过程&#xff0c;讲其标准化为教师可以带领学生完成的实训内容&#xff0c;真正帮助学生接触产业前沿技术和工作内容&#xff0c;提升就…

贪心算法习题其二【力扣】【算法学习day.18】

前言 ###我做这类文档一个重要的目的还是给正在学习的大家提供方向&#xff08;例如想要掌握基础用法&#xff0c;该刷哪些题&#xff1f;&#xff09;我的解析也不会做的非常详细&#xff0c;只会提供思路和一些关键点&#xff0c;力扣上的大佬们的题解质量是非常非常高滴&am…

【Axure原型分享】颜色选择器——填充颜色

今天和大家分享颜色选择器——填充颜色的原型模板&#xff0c;点击颜色区域可以弹出颜色选择器&#xff0c;点击可以选择对应颜色&#xff0c;颜色区域会变色我们选择的颜色&#xff0c;具体效果可以观看下方视频或者打开预览地址体验。 【原型效果】 【Axure高保真原型】颜色…

SQL实战训练之,力扣:1843. 可疑银行账户

目录 一、力扣原题链接 二、题目描述 三、建表语句 四、题目分析 五、SQL解答 六、最终答案 七、验证 八、知识点 一、力扣原题链接 1843. 可疑银行账户 二、题目描述 表: Accounts ---------------------- | Column Name | Type | ---------------------- | acco…

软件系统交付阶段必备文档,验收体系配套资料,软件系统各阶段各步骤相关配套资料,各类软件建设方案(word,ppt)

软件文档交付清单是指在软件开发项目完成后&#xff0c;开发团队需要准备的一份详细清单&#xff0c;用于确保交付的软件产品符合客户需求并达到预期的质量标准。以下是软件文档交付清单中可能包含的一些关键要素 软件资料清单列表部分文档清单&#xff1a;工作安排任务书&…

Day07爬楼梯

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; class Solution {public int climbStairs(int n) {if (n 1) return 1;if (n 2) return 2;return climbStairs(n - 1) climbStairs(n - 2);} }用…

【51单片机】串口通信原理 + 使用

学习使用的开发板&#xff1a;STC89C52RC/LE52RC 编程软件&#xff1a;Keil5 烧录软件&#xff1a;stc-isp 开发板实图&#xff1a; 文章目录 串口硬件电路UART串口相关寄存器 编码单片机通过串口发送数据电脑通过串口发送数据控制LED灯 结束语 串口 串口是一种应用十分广泛…