首页 > 编程语言 >过河卒,代码实现(递归算法)

过河卒,代码实现(递归算法)

时间:2024-11-10 12:44:57浏览次数:3  
标签:control arr 过河 递归 int return 算法 num run

题目

【输入形式】

       输入一行4个整数,分别表示B点的坐标(n,m)以及对方马的坐标(X,Y)

【输出形式】

       输出一个整数,表示路径的条数

【样例输入】

6 6 3 2

【样例输出】

17

1.思路

类似经典的爬楼梯问题(n级台阶,每次能走一个台阶或者两个台阶,求走到n的不同顺序),可以采取“倒着走”的形式,即通项An = An-1 +An-2;

转换到这题:每次走到的位置可以由这个位置的左边或者这个位置上边来得到。(例如:若此刻走到了(2,3),则可以从(1,3)往右走一步,或者从(2,2)往下走一步实现

2.代码实现

(1)定义一个棋盘(21*21),以及马所控制的位置的数组

int control_x[8] = { -1,1,-2,2,-2,2,-1,1 };
int control_y[8] = {2, 2, 1, 1, -1, -1, -2, -2};
int arr[21][21];

(2)标记一下马所控制的位置

    arr[x][y]++;                                            //马自身所在的位置
          
    for (int i = 0; i < 8; i++)                             //标记控制点
    {
        if((x +control_x[i])>0&&(y+control_y[i] > 0))       //加个边界判断
        arr[x + control_x[i]][y + control_y[i]]++;          
    }

(3)函数实现卒所走的路径

int run(int n, int m)      //此刻位置
{
    int num{ 0 };
    if (n == 0 && m == 0) return 1;
    if (arr[n][m]) return 0;          //如果走到的n,m那个位置是“1”(控制点),就此路不通
    num = (n > 0 ? run(n - 1, m) : 0) + (m > 0 ? run(n, m - 1) : 0);    
    return num;
}

(4)完整代码

#include<iostream>
using namespace std;

int control_x[8] = { -1,1,-2,2,-2,2,-1,1 };
int control_y[8] = {2, 2, 1, 1, -1, -1, -2, -2};
int arr[21][21];
int run(int n, int m)      //此刻位置
{
    int num{ 0 };
    if (n == 0 && m == 0) return 1;
    if (arr[n][m]) return 0;          //如果走到的n,m那个位置是“1”(控制点),就此路不通
    num = (n > 0 ? run(n - 1, m) : 0) + (m > 0 ? run(n, m - 1) : 0);
    return num;
}

int main()
{
    int n, m, x, y;
    cin >> n >> m >> x >> y;
    arr[x][y]++;            //自身标记
                           
    for (int i = 0; i < 8; i++)      //控制点标记
    {
        if((x +control_x[i])>0&&(y+control_y[i] > 0))      //加个边界判断
        arr[x + control_x[i]][y + control_y[i]]++;        
    }
    int num = run(n, m);
    cout << num;



}

标签:control,arr,过河,递归,int,return,算法,num,run
From: https://blog.csdn.net/2403_87544412/article/details/143658983

相关文章

  • 最短路径算法综述:原理、比较与实现
    最短路径算法综述:原理、比较与实现一、引言在图论和计算机科学领域,最短路径问题是一个经典且重要的研究内容。它在交通导航、网络路由、物流规划等众多实际应用场景中有着广泛的应用。本文将详细介绍几种常见的最短路径算法,包括Dijkstra算法、Bellman-Ford算法、Floy......
  • 排序算法原理、应用与对比
    一、排序算法综述排序算法在计算机科学中具有至关重要的地位。在众多应用场景中,如数据库管理、搜索引擎结果排序、数据分析等,高效的排序算法能够极大地提高系统的性能和用户体验。不同类型的排序算法具有各自独特的特点和分类。从算法的稳定性来看,有些算法是稳定的,如插入排序......
  • 代码随想录算法训练营第19天|235. 二叉搜索树的最近公共祖先 ,701.二叉搜索树中的插入
    235.二叉搜索树的最近公共祖先文章链接:https://programmercarl.com/0235.二叉搜索树的最近公共祖先.html题目链接:https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-search-tree/思路:利用二叉搜索树的特性,当第一次遇到在[p,q]区间或[q,p]区间的元素的节点,则......
  • 救命啊!字节大模型算法实习岗面试居然栽在Transformer上了!!
    为什么在进行softmax之前需要对attention进行scaled(为什么除以dk的平方根)?transformer论文中的attention是ScaledDot-PorductAttention来计算keys和queries之间的关系。如下图所示:在公式一中,作者对0和K进行点积以获得注意力权重,然后这些权重用于加权平均V。但在实......
  • 仪表图像识别算法
    仪表图像识别算法基于AI的机器视觉分析识别技术,通过训练深度学习模型,使得摄像头能够像人一样“看”懂仪表盘上的数据。这些现场监控摄像头能够实时捕捉仪表盘的图像,利用AI算法自动分析并识别出仪表的示数或开关状态。这种技术不仅能够在任何时间、任何地点进行自动读表,还可以通过......
  • 100种算法【Python版】第60篇——滤波算法之粒子滤波
    本文目录1算法步骤2算法示例:多目标跟踪3算法应用:多维非线性系统状态模拟粒子滤波(ParticleFilter)是一种基于随机采样的贝叶斯滤波方法,广泛应用于动态系统的状态估计。它通过在状态空间中使用一组随机粒子(样本)来表示后验分布,从而处理非线性和非高斯的状态估计问......
  • 代码随想录算法训练营第18天| 530.二叉搜索树的最小绝对差, 501.二叉搜索树中的众数 , 2
    530.二叉搜索树的最小绝对差文章链接:https://programmercarl.com/0530.二叉搜索树的最小绝对差.html视频链接:https://www.bilibili.com/video/BV1DD4y11779/?vd_source=6cb513d59bf1f73f86d4225e9803d47b题目链接:https://leetcode.cn/problems/minimum-absolute-difference-in......
  • 计算机毕业设计Python+大模型动漫推荐系统 动漫视频推荐系统 机器学习 协同过滤推荐算
    作者简介:Java领域优质创作者、CSDN博客专家、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、多年校企合作经验,被多个学校常年聘为校外企业导师,指导学生毕业设计并参与学生毕业答辩指导,有较为丰富的相关经验。期待与各位高校教师、企业......
  • 鸿蒙HarmonyOS证书算法库揭秘:设备认证的底层实现
    本文旨在深入探讨华为鸿蒙HarmonyOSNext系统(截止目前API12)的技术细节,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。在华为鸿蒙HarmonyOS的安全体系中,证书算......
  • 二维椭圆拟合算法及推导过程
    目录1、间接平差法2、最小二乘法3、matlab案例4、案例结果5、参考链接1、间接平差法  该方法忽略了半长轴相对于xxx轴的旋转角度,需要较好的初......