过河卒

Proble Description

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

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

INPUT

B点的坐标(n,m)以及对方马的坐标(X,Y){不用判错}

OUTPUT

一个整数(路径的条数)

Sample Input

6 6 3 2

Sample Output

17

分析

到达棋盘上的任意一点只有两条路:从上方,从左方。因此到达(n, m)点的路径数R(n, m)=R(n-1, m)+R(n, m-1),这就成了一个递推问题,递推的起点就是A点(0, 0)。整理一下,已知条件和递推规则如下:

  • 第0行,R(0, m)=R(0, m-1)
  • 第0列,R(n, 0)=R(n-1, 0)
  • 马可控点,R(n, m)=0
  • 其它,R(n, m)=R(n-1, m)+R(n, m-1)
  • 已知条件:R(0, 0)=1

这样,可把棋盘用一个二维数组来表示。一行一行扫描数组的每个元素进行计算,最终可推算出R(n, m)

代码示例

#include<iostream>
using namespace std;
int M[20][20]; //棋盘
int main(){
int n, m, X, Y;
scanf("%d%d%d%d", &n, &m, &X, &Y);
for(int i=0; i<=n; i++) //A点到B点之间的节点全部初始化为-1
for(int j=0; j<=m; j++)
M[i][j]=-1;
//马可控制点设置为0条路径
M[X][Y]=M[X-2][Y-1]=M[X-2][Y+1]=M[X-1][Y-2]=M[X-1][Y+2]=
M[X+2][Y-1]=M[X+2][Y+1]=M[X+1][Y-2]=M[X+1][Y+2]=0;
M[0][0]=1; //递推起点
for(int i=0; i<=n; i++)
for(int j=0; j<=m; j++){
if(i==0 && j==0) continue; //起点跳过
if(M[i][j]==0) continue; //马可控点跳过
if(i==0) M[i][j]=M[i][j-1];
else if(j==0) M[i][j]=M[i-1][j];
else M[i][j]=M[i-1][j]+M[i][j-1];
}
printf("%d", M[n][m]);
}

LFYZ-OJ ID: 1020 过河卒(NOIP2002)的更多相关文章

  1. 过河卒(Noip2002)(dp)

    过河卒(Noip2002) 时间限制: 1 Sec  内存限制: 128 MB提交: 7  解决: 6[提交][状态][讨论版][命题人:quanxing] 题目描述 棋盘上A点有一个过河卒,需要走到 ...

  2. 过河卒(NOIP2002)

    题目链接:过河卒 直接模拟?会T掉60分. 所以我们可以采用递推,怎么想到的? 因为卒子只能向下或向右走,所以走到一个点的方法数,等于走到它上面点的方法数加上走到它左边点的方法数,这样就可以地推了. ...

  3. 【openjudge】【递推】例3.6 过河卒(Noip2002)

    [题目描述] 棋盘上A点有一个过河卒,需要走到目标B点.卒行走的规则:可以向下.或者向右.同时在棋盘上的某一点有一个对方的马(如C点),该马所在的点和所有跳跃一步可达的点称为对方马的控制点,如图3-1 ...

  4. 【9307】&【a303】过河卒(NOIP2002)

    Time Limit: 10 second Memory Limit: 2 MB 问题描述 如图,A点有一个过河卒,需要走到目标B点.卒行走的规则:可以向下.或者向右. 同时在棋盘上的任一点有一个对方 ...

  5. noip2002 普及组 过河卒

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

  6. NOIP2002 过河卒(DFS,DP)

    https://www.luogu.org/problem/P1002 题目描述 如图,A 点有一个过河卒,需要走到目标 B 点.卒行走规则:可以向下.或者向右.同时在棋盘上的任一点有一个对方的马(如 ...

  7. NOIP 2002 过河卒

    洛谷P1002 https://www.luogu.org/problemnew/show/P1002 JDOJ 1290 https://neooj.com/oldoj/problem.php?id ...

  8. AC日记——过河卒 洛谷 1002

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

  9. NOIP 2002过河卒 Label:dp

    题目描述 如图,A 点有一个过河卒,需要走到目标 B 点.卒行走规则:可以向下.或者向右.同时在棋盘上的任一点有一个对方的马(如上图的C点),该马所在的点和所有跳跃一步可达的点称为对方马的控制点.例如 ...

随机推荐

  1. 微信小程序测试方法总结

    最近的新项目是小程序加web端后台管理 主要找了些文章方便自己使用也分享给大家: 小程序官方文档 https://developers.weixin.qq.com/miniprogram/design ...

  2. tomcat设置开机启动

    一.windows 1. 下载tomcat 2. 进入bin目录,查看是否存在service.dat,如果没有自行创建 3. 打开cmd,进入tomcat>bin目录 说明:用法: servic ...

  3. varnish学习以及CDN的原理

    一.varnish学习Web Page Cache: squid --> varnish 程序的运行具有局部性特征: 时间局部性:一个数据被访问过之后,可能很快会被再次访问到: 空间局部性:一个 ...

  4. Windows程序设计:格式化对话框的设计

    刚开始学习Windows程序设计,磕磕碰碰,先做个小笔记缓缓神经,主要是将MessageBox这个Windows API函数的. MessageBox函数是许多人刚开始学习Windows程序设计或者是 ...

  5. RabbitMQ集群搭建和使用

    一.环境准备 1.选择RabbitMQ的版本 http://www.rabbitmq.com/changelog.html 注: 不同版本的Linux选择的RabbitMQ版本也不同,参照 http: ...

  6. 安装Gradle(Windows & Linux)

    Gradle 是以 Groovy 语言为基础,面向Java应用为主.基于DSL(领域特定语言)语法的自动化构建工具.在github上,gradle项目很多,有的是gradel跟maven构建一块儿使用 ...

  7. 数据可视化的开源方案: Superset vs Redash vs Metabase (二)

    在上篇结尾处我提到“如果现在让我重新选择,我会使用哪个可视化工具?”我的答案是 Redash,原因主要不是功能层面,而是技术层面.本篇就从项目关注度与活跃度,项目的技术架构,源代码的规模与质量,这三个 ...

  8. day4-python基础-编码相关

    目录 1.编码的历史 2.python 3.x中的bytes与str 3.编码的转换 正文开始 1.编码的历史与发展 1.1编码历史变更 编码可以理解为谍战片中电报的密码本,如果要想让电脑识别要输入的 ...

  9. Oracle 史上最全近百条Oracle DBA日常维护SQL脚本指令

    史上最全近百条Oracle DBA日常维护SQL脚本指令 https://mp.weixin.qq.com/s?__biz=MjM5MDAxOTk2MQ==&mid=2650281305&am ...

  10. SyntaxError: missing ) after argument list

    消息 语法错误: 参数列表后面缺少 ) 错误类型 SyntaxError. 什么地方出错了? 有一个函数在调用时出现错误.这可能是一个错误,丢失运算符或者转义字符等. 示例 因为没有使用 ”+“ 操作 ...