【洛谷 P1002】[NOIP2002 普及组] 过河卒 题解(递归+记忆化搜索)

简介: `NOIP2002`普及组的过河卒问题是一个棋盘路径计数挑战。卒从$(0,0)$出发到$(n,m)$,只能向下或向右移动,马在$(c1,c2)$固定,控制某些点。任务是计算不受马阻挡的路径数。输入是目标和马的位置,输出是路径总数。使用动态规划和记忆化搜索避免重复计算,样例输入$(6,6,3,3)$输出$6$。代码中定义了$f(x,y)$计算$(x,y)$处的路径数,利用边界条件和递推关系计算。

[NOIP2002 普及组] 过河卒

题目描述

棋盘上 $A$ 点有一个过河卒,需要走到目标 $B$ 点。卒行走的规则:可以向下、或者向右。同时在棋盘上 $C$ 点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点。因此称之为“马拦过河卒”。

棋盘用坐标表示,$A$ 点 $(0, 0)$、$B$ 点 $(n, m)$,同样马的位置坐标是需要给出的。

现在要求你计算出卒从 $A$ 点能够到达 $B$ 点的路径的条数,假设马的位置是固定不动的,并不是卒走一步马走一步。

输入格式

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

输出格式

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

样例 #1

样例输入 #1

6 6 3 3

样例输出 #1

6

提示

对于 $100 \%$ 的数据,$1 \le n, m \le 20$,$0 \le$ 马的坐标 $\le 20$。

【题目来源】

NOIP 2002 普及组第四题

思路

该点路径数等于该点左边点的路径数与该点上面点的路径数之和。
从终点一直推回到起点,注意不要越界。数据会很大,记得用long long。

AC代码

#include <iostream>
#include <vector>
#define AUTHOR "HEX9CF"
using namespace std;

long long f(long long x, long long y);
long long n, m, c1, c2;
int ctrl[9][2] = {
   
   0, 0, 2, 1, 1, 2, -2, -1, -1, -2, -2, 1, -1, 2, 2, -1, 1, -2};
vector<vector<long long>> mem(30, vector<long long>(30, -1));
long long count = 0;

int main()
{
   
   
    cin >> n >> m >> c1 >> c2;

    /* for (long long i = 0; i < 9; i++)
    {
        cout << ctrl[i][1] << "," << ctrl[i][2] << endl;
    } */

    cout << f(n, m) << endl;
    // cout << count << endl;

    return 0;
}

long long f(long long x, long long y)
{
   
   
    if (mem[x][y] != -1)
    {
   
   
        return mem[x][y];
    }

    for (long long i = 0; i < 9; i++)
    {
   
   
        if (ctrl[i][0] + c1 == x && ctrl[i][1] + c2 == y)
        {
   
   
            // cout << ctrl[i][1] << "," << ctrl[i][2] << endl;
            // cout << 1 << endl;
            mem[x][y] = 0;
            return 0;
        }
    }

    if (x == 0 && y == 0)
    {
   
   
        count++;
        mem[x][y] = 1;
        return 1;
    }
    else if (x == 0)
    {
   
   
        mem[x][y] = f(x, y - 1);
        return mem[x][y];
    }
    else if (y == 0)
    {
   
   
        mem[x][y] = f(x - 1, y);
        return mem[x][y];
    }
    else
    {
   
   
        mem[x][y] = f(x - 1, y) + f(x, y - 1);
        return mem[x][y];
    }
    return mem[x][y];
}
目录
相关文章
|
机器学习/深度学习 数据建模 定位技术
【数据结构】图的基本概念—无/有向图、权和网、完全图、路径与回路
【数据结构】图的基本概念—无/有向图、权和网、完全图、路径与回路
5276 0
【数据结构】图的基本概念—无/有向图、权和网、完全图、路径与回路
|
7月前
|
人工智能 固态存储 iOS开发
5分钟搞定Photoshop 2025安装:官方下载+许可证激活避坑指南
Adobe Photoshop 2025 是 Adobe 公司推出的最新图像处理软件,广泛应用于平面设计、摄影后期和 UI 设计等领域。其核心功能包括智能 AI 工具(一键抠图、生成填充等)、高效工作流(优化图层管理与色彩调整)、跨平台兼容(支持 Windows 11 和 macOS 15)以及云协作功能(与 Adobe Creative Cloud 集成)。本文详细介绍软件的安装流程、系统要求、正版激活方法及常见问题解决方案,并提供扩展学习资源,帮助用户更好地掌握这款强大工具。
29229 3
|
8月前
|
开发框架 缓存 搜索推荐
PiliPala:开源项目真香,B站用户狂喜!这个开源APP竟能自定义主题+去广告?PiliPala隐藏功能大揭秘
嗨,大家好,我是小华同学。PiliPala 是一个基于 Flutter 开发的 BiliBili 第三方客户端,提供流畅、个性化的使用体验。核心功能包括视频浏览与推荐、用户互动、丰富的播放设置、多维度搜索和个性化主题等。相比官方客户端,PiliPala 功能更丰富、性能更优、界面更美观。
372 14
|
11月前
|
消息中间件 缓存 安全
Future与FutureTask源码解析,接口阻塞问题及解决方案
【11月更文挑战第5天】在Java开发中,多线程编程是提高系统并发性能和资源利用率的重要手段。然而,多线程编程也带来了诸如线程安全、死锁、接口阻塞等一系列复杂问题。本文将深度剖析多线程优化技巧、Future与FutureTask的源码、接口阻塞问题及解决方案,并通过具体业务场景和Java代码示例进行实战演示。
200 3
|
安全 开发工具 iOS开发
探索macOS原版镜像ISO的下载之道
探索macOS原版镜像ISO的下载之道
|
Rust JavaScript 前端开发
【Neovim】配置美化完整流程
【Neovim】配置美化完整流程
7505 0
【Neovim】配置美化完整流程
|
机器学习/深度学习 存储 数据采集
强化学习系列:A3C算法解析
【7月更文挑战第13天】A3C算法作为一种高效且广泛应用的强化学习算法,通过结合Actor-Critic结构和异步训练的思想,实现了在复杂环境下的高效学习和优化策略的能力。其并行化的训练方式和优势函数的引入,使得A3C算法在解决大规模连续动作空间和高维状态空间的问题上表现优异。未来,随着技术的不断发展,A3C算法有望在更多领域发挥重要作用,推动强化学习技术的进一步发展。
|
存储 弹性计算 运维
阿里云容器服务Kubernetes版(ACK)部署与管理体验评测
阿里云容器服务Kubernetes版(ACK)是一个功能全面的托管Kubernetes服务,它为企业提供了快速、灵活的云上应用管理能力。
405 2
|
算法 C++
计算机算法设计与分析 第2章 递归与分治策略 (笔记)
计算机算法设计与分析 第2章 递归与分治策略 (笔记)
198 0
|
存储
【洛谷 P2437】蜜蜂路线 题解(递归+记忆化搜索+高精度)
蜜蜂路线问题:蜜蜂从蜂房$m$到$n$($m&lt;n$)按数字递增爬行。给定$m$和$n$,求路线数。示例:$m=1$,$n=14$,输出$377$。100%数据$1\leq m,n\leq1000$。使用斐波那契序列优化,高精度处理大数。代码实现斐波那契存储并动态规划求解。
268 0