题目链接:https://www.luogu.com.cn/problem/P1002

题目大意

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

棋盘用坐标表示,\(A\)点\((0, 0)\)、\(B\)点\((n, m)\)(\(n\), \(m\)为不超过\(20\)的整数),同样马的位置坐标是需要给出的。

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

输入格式

一行四个数据,分别表示\(B\)点坐标和马的坐标。

输出格式

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

样例输入1

6 6 3 3

样例输出1

6

题解

首先,不难看出,这是一道 动态规划 问题。

我们可以令 \(f[i][j]\) 表示从 \((0,0)\)(左上方的点)走到 \((i,j)\) (第\(i\)行第\(j\)列)的方案数。

那么,在不考虑马的存在的时候,可以得到状态转移方程如下:

  • 如果 \(i=0\) 且 \(j=0\) ,则 \(f[i][j] = 1\);
  • 否则,如果 \(i=0\) ,则 \(f[i][j] = f[i][j-1]\);
  • 否则,如果 \(j=0\) ,则 \(f[i][j] = f[i-1][j]\);
  • 否则,\(f[i][j] = f[i-1][j] + f[i][j-1]\)。

但是,这里有马的存在,左移在上述条件的基础上,我们必须先进行一步判断(并且这一步判断还是必须放在最前面的):

  • 如果 \((i,j)\) 处于马的公鸡范围内,则 \(f[i][j] = 0\)。

实现代码如下:

#include <bits/stdc++.h>
using namespace std;
int n, m, x, y;
long long f[22][22];
int main() {
cin >> n >> m >> x >> y;
for (int i = 0; i <= n; i ++) {
for (int j = 0; j <= m; j ++) {
if (abs(x-i)==2 && abs(y-j)==1 || abs(x-i)==1 && abs(y-j)==2 || x==i && y==j) f[i][j] = 0;
else if (i==0 && j==0) f[i][j] = 1;
else if (i==0) f[i][j] = f[i][j-1];
else if (j==0) f[i][j] = f[i-1][j];
else f[i][j] = f[i-1][j] + f[i][j-1];
}
}
cout << f[n][m] << endl;
return 0;
}

洛谷P1002 过河卒 题解 动态规划的更多相关文章

  1. 洛谷P1002 过河卒(动态规划)

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

  2. 随手练——洛谷-P1002 过河卒(动态规划入门)

    题目链接:https://www.luogu.org/problemnew/show/P1002 题目还算良心,提醒了结果可能很大,确实爆了int范围, 这是一开始写的版本,用递归做的,先给地图做标记 ...

  3. 洛谷 P1002过河卒

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

  4. 洛谷P1002 过河卒 [2017年4月计划 动态规划15]

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

  5. 洛谷P1002——过河卒

    又是洛谷题,要不是有小姐姐不会,我才不想动脑子.先贴一下题目地址https://www.luogu.org/problem/P1002 再贴一下题目: 我们读一下题目,这可不比学校的**算法题,读完一 ...

  6. 洛谷 P1002 过河卒 【棋盘dp】

    题目链接:https://www.luogu.org/problemnew/show/P1002 题目描述 棋盘上A点有一个过河卒,需要走到目标B点.卒行走的规则:可以向下.或者向右.同时在棋盘上C点 ...

  7. 洛谷[P1002]过河卒

    原题地址:https://www.luogu.org/problemnew/show/P1002 题目描述 棋盘上A点有一个过河卒,需要走到目标B点.卒行走的规则:可以向下.或者向右.同时在棋盘上C点 ...

  8. 洛谷P1002 过河卒

    关于蒟蒻的我,刚刚接触DP....   那么就来做一道简单DP吧.... 首先先看题: 题目描述 棋盘上AA点有一个过河卒,需要走到目标BB点.卒行走的规则:可以向下.或者向右.同时在棋盘上CC点有一 ...

  9. 洛谷P1002 过河卒【dp】

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

随机推荐

  1. 模板—e-dcc缩点

    int dfn[MAXN],low[MAXN],cnt; bool isbridge[MAXN]; void tarjan(int x,int edg) { low[x]=dfn[x]=++cnt; ...

  2. H3C 典型物理层标准和设备

  3. hsqldb使用

    1 hsqldb介绍 HyperSQL DataBase 是一个现代的关系数据库管理软件,比较彻底遵从SQL:2008标准和JDBC4规范.支持SQL:2008标准所以的核心特性和很多的可选特性. H ...

  4. java接口(interface)

    引入:抽象类是从多个类中抽象出来的模板,若要将这种抽象进行得更彻底,就得用到一种特殊的“抽象类”→ 接口; 例子: 生活中听说过的USB接口其实并不是我们所看到的那些插槽,而是那些插槽所遵循的一种规范 ...

  5. H3C 基本的局域网间路由

  6. Java动态编译优化——提升编译速度(N倍)

    一.前言 最近一直在研究Java8 的动态编译, 并且也被ZipFileIndex$Entry 内存泄漏所困扰,在无意中,看到一个第三方插件的动态编译.并且编译速度是原来的2-3倍.原本打算直接用这个 ...

  7. H3C设置vty

    [H3C]User-interface vty 0 4     //进入telnet模式 [H3C-ui-vty0-4]autchentication-mode  none       //telne ...

  8. 【20.95%】【UESTC 94】Bracket Squence

    Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit  Status T ...

  9. es6笔记 day1---let和const的应用

    ES6 -> ECMA标准 ES7  ES8 最早是由ECMA-262版本实现的 ---------------------------------------- ES6 也称为ES2015,2 ...

  10. LightOJ - 1287 Where to Run (期望dp+记忆化)

    题面: Last night you robbed a bank but couldn't escape and when you just got outside today, the police ...