大家好,我是屁孩君,今天屁孩君拿出一道十分典型的递推题跟大家分享。
先让我们来康康题目吧!
A 点有一个过河卒,需要走到目标 B 点。卒行走规则:可以向下、或者向右。同时在棋盘上的任一点有一个对方的马(如下图的C点),该马所在的点和所有跳跃一步可达的点称为对方马的控制点。例如下图 C 点可以控制 9 个点(图中的P1,P2 … P8 和 C)。卒不能通过对方马的控制点。 棋盘用坐标表示,现给定A 点位置为(0,0)B 点位置为(n,m)(n,m 为不超过 10 的整数),马的位置为C(X,Y)(约定: C点与A点不重叠,与B点也不重叠)。要求你计算出卒从 A 点能够到达 B 点的路径的条数。

输入
B点的坐标(n,m)以及对方马的坐标(X,Y)(马的坐标一定在棋盘范围内,但要注意,可能落在边界的轴上)

输出
样例
输入
6 6 3 2
输出
17
注意:每个点的路径条数代表的是到达此点有几种方法。

目录

  • 不包含马和马的控制点路径条数规律是什么?
  • 包含马和马的控制点的路径条数如何求解?
  • 算法
  • 分步完成

不包含马和马的控制点路径条数规律是什么?

正常情况下,也就是元素不在第一列,第一行,这种情况下,a[i][j]的路径条数等于a[i-1]+a[i][j-1](a[i][j]的正上方与左边的元素之和)。
因为卒只能向右或向下走,所以a[i][j]的路径条数等于a[i-1]+a[i][j-1](a[i][j]的正上方与左边的元素之和)

但是,还有一种情况,a[i][j]的位置在第一列或第一行,这样一来,a[i][j]的正上方或a[i][j]的左边的元素不就没了吗?所以我们要加两个判断语句,切记,要分清情况,判断是否是第一行或第一列,如果是在第一列,那我们就只加上他的正上方的元素,如果是在第一行,那我们就只加上左边的元素。


现在,还有一种情况,那就是,此元素位于第一行第一列,那我们就在设一个判断语句就ok了,这样就是没有马和马的控制点的路径条数的规律了!

包含马和马的控制点的路径条数如何求解?

那如果我们又加上马和马的控制点呢,这其实也很简单,我们只要把马和马的控制点给设置为零,那我们就算把他加上也无碍。但是把马的位置上的元素设为零是挺简单的,但是,你把马的控制点也设为零,就十分麻烦,并且容易打错,不过,这一步只要仔细一点就行了!

算法

讲了这么多,我们又来到了熟悉的算法区。
1:将我们定义的二维数组全部初值设为1。
2:将马的位置于马的控制点的位置的元素设为0。
3:双重循环遍历出每个点的路径条数(不包括马和马的控制点,第一行第一列的元素,如果遇到,直接continue)。
4:输出目标点的路径条数。

分步完成

1:将我们定义的二维数组全部初值设为1。

for(int i=0;i<=n;i++)
{for(int j=0;j<=m;j++)a[i][j]=1;
}

2:将马的位置于马的控制点的位置的元素设为0。

a[x][y]=0;
if(x-1>=0&&y-2>=0)a[x-1][y-2]=0;
if(x-2>=0&&y-1>=0)a[x-2][y-1]=0;
if(x-2>=0&&y+1<=m)a[x-2][y+1]=0;
if(x-1>=0&&y+2<=m)a[x-1][y+2]=0;
if(x+1<=n&&y+2<=m)a[x+1][y+2]=0;
if(x+2<=n&&y+1<=m)a[x+2][y+1]=0;
if(x+2<=n&&y-1>=0)a[x+2][y-1]=0;
if(x+1<=n&&y-2>=0)a[x+1][y-2]=0;

3:双重循环遍历出每个点的路径条数(不包括马和马的控制点,第一行第一列的元素,如果遇到,直接continue)。

for(int i=0;i<=n;i++)
{for(int j=0;j<=m;j++){if(i==0&&i==j)continue; if(a[i][j]==0)continue;if(i==0)a[i][j]=a[i][j-1];if(j==0)a[i][j]=a[i-1][j];if(i!=0&&j!=0&&a[i][j]!=0)//正常情况a[i][j]=a[i-1][j]+a[i][j-1];}
}

4:

cout<<a[n][m]<<endl;

话不多说,直接上完整代码

#include<bits/stdc++.h>
using namespace std;
int a[50][50];
int main()
{int n,m,x,y,i,j;cin>>n>>m>>x>>y;for(int i=0;i<=n;i++){for(int j=0;j<=m;j++)a[i][j]=1;}a[x][y]=0;if(x-1>=0&&y-2>=0)a[x-1][y-2]=0;//将马的控制点设为0if(x-2>=0&&y-1>=0)a[x-2][y-1]=0;//将马的控制点设为0if(x-2>=0&&y+1<=m)a[x-2][y+1]=0;//将马的控制点设为0if(x-1>=0&&y+2<=m)a[x-1][y+2]=0;//将马的控制点设为0if(x+1<=n&&y+2<=m)a[x+1][y+2]=0;//将马的控制点设为0if(x+2<=n&&y+1<=m)a[x+2][y+1]=0;//将马的控制点设为0if(x+2<=n&&y-1>=0)a[x+2][y-1]=0;//将马的控制点设为0if(x+1<=n&&y-2>=0)a[x+1][y-2]=0;//将马的控制点设为0for(int i=0;i<=n;i++){for(int j=0;j<=m;j++){if(i==0&&i==j)continue; if(a[i][j]==0)continue;//跳过if(i==0)a[i][j]=a[i][j-1];if(j==0)a[i][j]=a[i-1][j];if(i!=0&&j!=0&&a[i][j]!=0)a[i][j]=a[i-1][j]+a[i][j-1];}}cout<<a[n][m]<<endl;return 0;
}

今天就给大家分享到这了!
古德拜!!!
记得一键三连哦!!!

c++过河卒(递推求解)题解相关推荐

  1. 解题报告:NOIP2013 车站分级(拓扑序递推求解差分约束、建图优化O(n+m)) 超详细讲解

    本题是2013年NOIP普及组的压轴题 差分约束裸题. 计算当前线路中最小的级别(比较始发站和终点站). 整条线路中所有大于这个级别的都必须停靠 所有未停靠的站点的级别一定小于这个级别 也就是说所有未 ...

  2. 整数划分问题【递归以及递推求解方式】

    简述 用一系列正整数之和来表示一个整数,称之为整数划分.而整数划分问题则对于某个数字,输出对应整数划分的数量. 先写递归,有了递归之后,就换用递推来加快速度. 算法思路 q(n, m)表示,n这个整数 ...

  3. hdu 2046 骨牌铺方格 递推求解

    骨牌铺方格 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Subm ...

  4. 洛谷过河卒--C语言求解

    · 题目描述 棋盘上 AA 点有一个过河卒,需要走到目标 BB 点.卒行走的规则:可以向下.或者向右.同时在棋盘上 CC 点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点.因此称 ...

  5. 一只小蜜蜂...(递推求解)

    Problem Description 有一只经过训练的蜜蜂只能爬向右侧相邻的蜂房,不能反向爬行.请编程计算蜜蜂从蜂房a爬到蜂房b的可能路线数. 其中,蜂房的结构如下所示. Input 输入数据的第一 ...

  6. HDU1847Good Luck in CET-4 Everybody!递推求解必胜、必败点 附三种经典博弈

    Problem Description 大学英语四级考试就要来临了,你是不是在紧张的复习?也许紧张得连短学期的ACM都没工夫练习了,反正我知道的Kiki和Cici都是如此.当然,作为在考场浸润了十几载 ...

  7. N阶楼梯上楼问题(递推求解)

    N阶楼梯上楼问题:一次可以走一阶或者两阶,问有多少种上楼方式. 因为只可能从n-1阶和n-2阶走到n阶,因此走到n阶的方式数量=走到n-1阶的方式数量+走到n-2阶的方式的数量. 也就是F[n]=F[ ...

  8. 利用配方法引入特征根法来求解二阶递推通项

    利用配方法引入特征根法来求解二阶递推通项 引言 本文从配方法的角度引入特征法来求解二阶递推通项; 利用高中的知识水平便可以理解, 笔者观察相似文章皆是聚焦于通项的推导, 并未以思考的方式去回答为何做出 ...

  9. 斐波拉契数列的递推递归求解算法

    介绍: 斐波那契数列(Fibonacci sequence),又称黄金分割数列.因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为"兔子数 ...

最新文章

  1. Java 工程师必须掌握的 JVM 类加载机制!
  2. MySQL 错误1418
  3. android界面基本属性
  4. 计算机组成原理:I/O的三大特性
  5. Linux高可用性方案之Heartbeat的CRM节点得分计算(原创)
  6. 电信基础设施共建共享
  7. 计算机信息技术知识点思维导图,思维导图信息技术的学习方法
  8. html缓存的图片放在哪里,浏览器图片缓存在哪
  9. macOS Monterey 12.1 (21C52) 正式版 ISO、IPSW、PKG 下载
  10. IOS 定位 CLLocationManager
  11. 【通用】Windows Server 2012突然无法复制文件到阿里云服务器
  12. 高考失利之后,属于我的大学本科四年
  13. img 图片自适应大小
  14. TRUNCATE 命令用法
  15. 向模拟器的sdcard中添加文件
  16. [COI2012] TRAMPOLIN
  17. 面试常问集锦——分布式系列
  18. 支持向量机(SVM)----超详细原理分析讲解
  19. 记录一下对接腾讯云IM的部分接口(群聊、单聊)
  20. (C语言)八大排序之:归并排序

热门文章

  1. linux tomcat 汤姆凯特
  2. 三元锂SOC-OCV修正
  3. 喜马拉雅基于DeepRec构建AI平台实践
  4. 会声会影X8旗舰版新增功能特性与下载安装体验
  5. 《痞子衡嵌入式半月刊》 第 14 期
  6. 雅克比矩阵 matlab,Matlab - jacobian函数
  7. CVPR 2022 | MLP才是无监督学习比监督学习迁移性能好的关键因素
  8. HDU 3908 Triple
  9. Python同切圆绘画以及圆的面积求解
  10. java addslashes_php addslashes()函数的使用