过河卒

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. 【笔记】嵩天.Python语言程序设计.完成两个简单实例(温度转换和绘图)

    [博客导航] [Python相关] 目标 使用PyCharm,完成两个小实例的编写和运行.一个是温度转换,一个是蟒蛇图形绘制. 过程 1.先设置project目录,虽然命名不是很正式,主要不太习惯软件 ...

  2. [LeetCode] 3. 无重复字符的最长子串

    题目链接:(https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/) 题目描述: 给定一个字符 ...

  3. Django路由(url)

    1.基本配置 from django.conf.urls import url from . import views urlpatterns = [ url(r'^articles/2003/$', ...

  4. MyExceptionFilter 异常注入

    public class MyExceptionFilter : IExceptionFilter { private ILogService logService; public MyExcepti ...

  5. 老牌开源Office操作组件NPOI现已支持.NET Core

    昨天在微信群里听到老牌Excel开发利器NPOI的作者瞿总说4.6.1版本的NPOI已经支持.NET Standard 2.0了,这也就意味着你可以在.NET Core中使用NPOI了. 作者:依乐祝 ...

  6. Python + Tornado 搭建自动回复微信公众号

    1 通过 pip 安装 wechat-python-sdk , Requests 以及 Tornado pip install tornado pip install wechat-sdk pip i ...

  7. ADO.NET之使用DataSet类更新数据库

    1.首先从数据库获得数据填充到DataSet类,该类中的表和数据库中的表相互映射. 2.对DataSet类中的表进行修改(插入,更新,删除等) 3.同步到数据库中:使用SqlDataAdapter实例 ...

  8. ES7

    本文是自己所学的ES7的一些常用的新特性: 一.padStart()方法,padEnd()方法: 如果某个字符串不够指定长度,有两个方法可以在头部或尾部补全.padStart()用于头部补全,padE ...

  9. 虚拟机系统安装Messenger和Server

    YCD对支持虚拟机运行Messenger和Server, 不论用哪种虚拟机安装, 请保证: 确认DirectX和Direct 3D组件已经开启 为虚拟机分配显卡计算资源 如果不满足以上条件, 虚拟机上 ...

  10. JAVA多线程-初体验

    一.线程和进程 每个正在系统上运行的程序都是一个进程.每个进程包含一到多个线程. 进程是所有线程的集合,每一个线程是进程中的一条执行路径. 二.为什么使用多线程,哪些场景下使用 多线程的好处是提高程序 ...